Android Studio添加数据库代码后应用崩溃,提示contacts表不存在
Android应用因SQLite表不存在崩溃修复方案
我在Android Studio中添加数据库代码后,应用频繁停止运行。无法定位数据库问题,多次排查无果,现提供databaseOpenHelper代码及Logcat报错信息,请求协助修复。
databaseOpenHelper代码
public class databaseOpenHelper extends SQLiteOpenHelper{ // Country table name private static final String TABLE_NAME= "contacts"; // Country Table Columns names private static final String KEY_ID = "id"; private static final String NAME = "Name"; private static final String PHONENO = "PhoneNo"; public databaseOpenHelper(Context context){ super(context,"Login.db",null,1); } @Override public void onCreate(SQLiteDatabase myDB) { myDB.execSQL("create Table users(username Text primary key,password Text)"); // create the table for the first time String CREATE_COUNTRY_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + NAME + " TEXT," + PHONENO + " TEXT" + ")"; myDB.execSQL(CREATE_COUNTRY_TABLE); } @Override public void onUpgrade(SQLiteDatabase myDB, int i, int i1) { myDB.execSQL("drop Table if exists users"); } public Boolean isertData(String username,String password){ SQLiteDatabase myDB = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("username",username); contentValues.put("password",password); long result = myDB.insert("users",null,contentValues); if(result == -1){ return false; } else { return true; } } public Boolean checkusername(String username){ SQLiteDatabase myDB = this.getWritableDatabase(); Cursor cursor = myDB.rawQuery("select * from users where username = ?",new String[] {username}); if (cursor.getCount()>0){ return true; } else { return false; } } public Boolean checkusernamePassword(String username,String password){ SQLiteDatabase myDB = this.getWritableDatabase(); Cursor cursor = myDB.rawQuery("select * from users where username = ? and password = ?",new String[] {username,password}); if (cursor.getCount()>0){ return true; } else{ return false; } } // method to add the contact public void addcontact(ContactModel contact){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues c=new ContentValues(); c.put(NAME,contact.getName()); c.put(PHONENO,contact.getPhoneNo()); db.insert(TABLE_NAME,null,c); db.close(); } // method to retrieve all the contacts in List public List<ContactModel> getAllContacts(){ List<ContactModel> list=new ArrayList<>(); String query="SELECT * FROM "+TABLE_NAME; SQLiteDatabase db=this.getReadableDatabase(); Cursor c=db.rawQuery(query,null); if(c.moveToFirst()) { do { list.add(new ContactModel(c.getInt(0),c.getString(1),c.getString(2))); } while (c.moveToNext()); } return list; } // get the count of data, this will allow user // to not add more that five contacts in database public int count(){ int count=0; String query="SELECT COUNT(*) FROM "+TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor c=db.rawQuery(query,null); if(c.getCount()>0){ c.moveToFirst(); count=c.getInt(0); } c.close(); return count; } // Deleting single country public void deleteContact(ContactModel contact) { SQLiteDatabase db = this.getWritableDatabase(); int i=db.delete(TABLE_NAME,KEY_ID + " = ?", new String[] { String.valueOf(contact.getId()) }); db.close(); } }
Logcat报错信息
FATAL EXCEPTION: main Process: com.example.localisation, PID: 11700 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.localisation/com.example.localisation.phone}: android.database.sqlite.SQLiteException: no such table: contacts (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM contacts at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: android.database.sqlite.SQLiteException: no such table: contacts (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM contacts at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1047) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:654) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:62) at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1546) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1485) at com.example.localisation.databaseOpenHelper.getAllContacts(databaseOpenHelper.java:108) at com.example.localisation.phone.onCreate(phone.java:81) at android.app.Activity.performCreate(Activity.java:8051) at android.app.Activity.performCreate(Activity.java:8031) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
问题分析
报错核心是SQLiteException: no such table: contacts,原因有两点:
onUpgrade方法遗漏contacts表处理:当前代码仅在版本更新时删除users表,未处理contacts表,导致数据库更新后不会重建该表;- 旧数据库已存在:如果之前安装过应用,旧数据库文件已创建(当时没有
contacts表),而onCreate仅在数据库首次创建时执行,不会重复执行,因此contacts表从未被创建。
修复方案
方案一:开发阶段快速验证
直接卸载当前应用,重新安装。这会删除旧数据库文件,触发onCreate执行,创建所有表。
方案二:正式版本适配
修改onUpgrade方法,确保版本更新时正确处理所有表,同时调整数据库版本号:
@Override public void onUpgrade(SQLiteDatabase myDB, int oldVersion, int newVersion) { // 删除所有旧表(若需保留数据,可改用ALTER TABLE语句) myDB.execSQL("DROP TABLE IF EXISTS users"); myDB.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); // 重新创建所有表 onCreate(myDB); } // 构造方法中把版本号从1改为2 public databaseOpenHelper(Context context){ super(context,"Login.db",null,2); }
额外优化点
- 方法名拼写错误:
isertData改为insertData,避免调用时出错; - 避免频繁关闭数据库:
addcontact和deleteContact中直接调用db.close()会导致连接频繁销毁重建,建议统一管理数据库连接; - 统一使用常量:
insert和rawQuery中的字符串(如"username")替换为已定义的常量,减少拼写错误。
内容的提问来源于stack exchange,提问作者youna kim
相关产品推荐
相关产品推荐

