【问题标题】:After deleting android database getReadableDatabase() won't create a new database删除 android 数据库后 getReadableDatabase() 不会创建新数据库
【发布时间】:2015-06-04 16:26:03
【问题描述】:

我通过执行 rm /data/data/app/databases/database 删除了 android 数据库。删除它后,我尝试再次运行该应用程序,但由于尚未创建表,因此出现异常。我得到的异常是 E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException:无法创建服务wificontroller.WifiControllerService:android.database.sqlite.SQLiteException:没有这样的表:

我在

中创建表格
public class DataStore extends SQLiteOpenHelper{

private static final String TAG = "Database";
private static final String DatabaseName = "Database";
private static final String NICKNAME_TABLE_NAME = "nicknames";
private static final String SCAN_TABLE_NAME = "scans";
private static final int Version = 2;

private static final String NICKNAME_TABLE_CREATE = "Query I cant show"

private static final String SCAN_TABLE_CREATE = "Query I cant show"

public DataStore(Context context) {
    super(context, DatabaseName , null, Version);
}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.d(TAG, "Creating database");

    try {
        db.execSQL(NICKNAME_TABLE_CREATE);
        db.execSQL(SCAN_TABLE_CREATE);
    }
    catch (Exception e){
        Log.e(TAG, "Could not create database", e);
        Log.e(TAG, "Query 1: " + NICKNAME_TABLE_CREATE);
        Log.e(TAG, "Query 2: " + SCAN_TABLE_CREATE);
    }

}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(TAG, "On Upgrade called");
}
public String[] getScanColumns(){
    return new String[]{"accessPoints", "clients", "status","timeOfStartScan", "packetsFound"};
}
public String getDatabaseName(){
    return DatabaseName;
}
public String getScanTableName(){
    return SCAN_TABLE_NAME;
}

调用数据库的方法是

SQLiteDatabase database = dbHelper.getReadableDatabase();

Cursor mCursor = database.rawQuery("SELECT QUERY", null); //THIS IS THE LINE THAT THROWS THE EXCEPTION

try {
    if (mCursor != null) {
        mCursor.moveToFirst();

        Log.w(Tag, "Packets found on last scan = " + mCursor.getString(mCursor.getColumnIndex("packetsFound")));

        Log.i(Tag, "Successfully loaded database scan");
     } else {
        Log.w(Tag, "Could not retrieve scan from database");
     }
 }
 catch (Exception e){
    Log.w(Tag, "Could not retrieve scan data from database probably because it doesn't exist");
}
finally {
        mCursor.close();
}

我已经确认 On Create 或 On Upgrade 都没有被调用。很抱歉,我无法发布它们是专有的查询,但我知道它们编译正确,因为这已经工作了很长时间。

我尝试重新安装应用程序并删除所有用户数据,但没有任何效果。关于为什么我突然不能再查询我的数据库的任何想法。

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    以防其他人也遇到这个问题。我的最初失败是因为数据库不知道数据库已更改并且我需要增加版本,如上所述,但是当我的 on create 在尝试执行所有查询之前失败时,我遇到了非常相似的问题。其中一个查询很糟糕,我第一次执行它失败了,但之后每次它都没有重试调用 Create。简而言之,如果 Oncreate 失败一次,那么您必须从手机中完全删除该应用程序并重试。

    【讨论】:

    • 或者只是不要在onCreate() 中捕获异常,以防止创建损坏的数据库。
    • 我一开始就应该这样做。虽然它会导致有趣的行为,所以我想如果他们来到同一个地方,我会尝试帮助其他人。
    • > 简而言之,如果 Oncreate 失败一次,那么您必须从手机中完全删除 > 应用程序并重试。这不是一个适当的解决方案。如果我们想提供更新,那么我们删除数据库并尝试再次创建更新。所以有错误。而且我们不能告诉用户从手机中删除应用程序并重新安装!!!!!!
    【解决方案2】:

    你必须增加版本。

    试试

    private static final int Version = 3;
    

    【讨论】:

    • 这将导致在升级时被调用,但为什么不在创建时被调用。我也需要它来创建新数据库。
    • 您可以:1.从升级中调用创建功能或2.从设置->应用程序管理中删除应用程序并重新安装应用程序。
    • 这为我解决了问题。我没有意识到当你删除数据库时它不会再次调用 Create。你对此有什么解释吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2015-09-22
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多