Android应用数据库问题:DBAdapter类无法被Activity识别
解决Android中DBAdapter类无法被Activity识别的问题
看起来你遇到的问题很典型——明明DBAdapter代码没语法错误,但Activity就是找不到它,还报cannot resolve symbol。我帮你分析下最可能的原因,以及对应的解决办法:
最核心的问题:包名未声明
看你提供的DBAdapter代码,开头没有包名声明!而你的MainActivity在biz.goodrich.daniel.databases包下,这就导致DBAdapter默认处于“默认包”中,和MainActivity不在同一个命名空间,所以Activity无法识别它。
解决步骤
- 给DBAdapter添加正确的包名
在DBAdapter的所有import语句之前,加上和MainActivity一致的包名:
package biz.goodrich.daniel.databases; import android.content.ContentValues; import android.content.Context; // 其他import...
- 检查导入语句(如果包不同的话)
如果之后还是报错,确认MainActivity顶部是否导入了DBAdapter:
import biz.goodrich.daniel.databases.DBAdapter;
不过因为我们已经把DBAdapter放到同一个包下,这一步通常可以省略,但如果有特殊情况可以加上。
- 清理Android Studio缓存并重建项目
有时候IDE缓存会导致奇怪的识别问题,执行以下操作:
- 点击顶部菜单栏的
File -> Invalidate Caches...,选择Invalidate and Restart - 重启后,执行
Build -> Clean Project,再执行Build -> Rebuild Project
修改后的完整DBAdapter代码示例
package biz.goodrich.daniel.databases; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DBAdapter { static final String KEY_ROWID = "_id"; static final String KEY_NAME = "name"; static final String KEY_EMAIL = "email"; static final String TAG = "DBAdapter"; static final String DATABASE_NAME = "MyDB"; static final String DATABASE_TABLE = "contacts"; static final int DATABASE_VERSION = 1; static final String DATABASE_CREATE = "create table contacts (_id integer primary key autoincrement, " + "name text not null, email text not null);"; final Context context; DatabaseHelper DBHelper; SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS contacts"); onCreate(db); } } //---opens the database--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---closes the database--- public void close() { DBHelper.close(); } //---insert a contact into the database--- public long insertContact(String name, String email) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_NAME, name); initialValues.put(KEY_EMAIL, email); return db.insert(DATABASE_TABLE, null, initialValues); } //---deletes a particular contact--- public boolean deleteContact(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---retrieves all the contacts--- public Cursor getAllContacts() { return db.query(DATABASE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_EMAIL}, null, null, null, null, null); } //---retrieves a particular contact--- public Cursor getContact(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---updates a contact--- public boolean updateContact(long rowId, String name, String email) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_EMAIL, email); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } }
做完这些步骤后,应该就能解决Activity无法识别DBAdapter的问题了。如果还有疑问,可以再检查下文件的存放路径是否和包名对应(比如DBAdapter应该放在src/main/java/biz/goodrich/daniel/databases/目录下)。
内容的提问来源于stack exchange,提问作者Daniel Goodrich
相关产品推荐
相关产品推荐

