You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,原因有两点:

  1. onUpgrade方法遗漏contacts表处理:当前代码仅在版本更新时删除users表,未处理contacts表,导致数据库更新后不会重建该表;
  2. 旧数据库已存在:如果之前安装过应用,旧数据库文件已创建(当时没有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16