Android 检查sqlite中是否存在数据库

Android 检查sqlite中是否存在数据库,android,sqlite,Android,Sqlite,我有一个带有sqllite数据库的android应用程序。这个数据库有各种表。到目前为止,我有两个表,我有一个错误:当我首先创建表A时,当我运行表B的代码时,我的应用程序崩溃;当我先创建表B,然后创建表A时,应用程序也会崩溃。我必须清除我的应用缓存,这样我才能更改访问权限,因此我永远无法在同一个应用运行中访问这两个应用。我想这是因为我在添加新表时正在重新创建数据库。为了避免这种情况,我尝试检查数据库是否已经存在,如果已经存在,则不重新创建,但我在构造函数中检查它,android不允许 日志: 1

我有一个带有sqllite数据库的android应用程序。这个数据库有各种表。到目前为止,我有两个表,我有一个错误:当我首先创建表A时,当我运行表B的代码时,我的应用程序崩溃;当我先创建表B,然后创建表A时,应用程序也会崩溃。我必须清除我的应用缓存,这样我才能更改访问权限,因此我永远无法在同一个应用运行中访问这两个应用。我想这是因为我在添加新表时正在重新创建数据库。为了避免这种情况,我尝试检查数据库是否已经存在,如果已经存在,则不重新创建,但我在构造函数中检查它,android不允许

日志:

12-25 00:30:28.024 32031-32031/com.support.android.iplfit E/AndroidRuntime:致命异常:main 进程:com.support.android.iplfit,PID:32031 android.database.sqlite.SQLiteException:没有这样的表:Dica代码1:,编译时:从Dica删除 在android.database.sqlite.SQLiteConnection.nativePrepareStatementNative方法中 位于android.database.sqlite.SQLiteConnection.acquirePreparedStatementSQLiteConnection.java:889 在android.database.sqlite.SQLiteConnection.prepareSQLiteConnection.java:500 位于android.database.sqlite.SQLiteSession.prepareSQLiteSession.java:588 在android.database.sqlite.SQLiteProgram.SQLiteProgram.java:58 位于android.database.sqlite.SQLiteStatement.SQLiteStatement.java:31 在android.database.sqlite.SQLiteDatabase.deleteSQLiteDatabase.java:1499 在com.support.android.iplfit.BDHelpers.DicaBDHelper.RemoveAllDicasbddicabdhelper.java:73 请访问com.support.android.iplfit.Singletons.SingletonDicas.adicionarDicasBDSingletonDicas.java:65 位于com.support.android.iplfit.Singletons.SingletonDicas$1.onResponseSingletonDicas.java:83 位于com.support.android.iplfit.Singletons.SingletonDicas$1.onResponseSingletonDicas.java:77 在com.android.volley.toolbox.JsonRequest.deliverResponseJsonRequest.java:65 在com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.runExecutorDelivery.java:99 位于android.os.Handler.handleCallbackHandler.java:751 在android.os.Handler.dispatchMessageHandler.java:95 在android.os.Looper.Looper.java:154 在android.app.ActivityThread.mainActivityThread.java:6077 在java.lang.reflect.Method.Invokenactive方法中 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:866 位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:756

以及我创建一个表的一个类:

public class DicaBDHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "db_iplfit";
    private static final int DB_VERSION = 1;
    private static final String TABLE_NAME = "Dica";

    private static final String ID_DICA = "id";
    private static final String CHANNEL_DICA = "channel";
    private static final String TITULO_DICA = "titulo";
    private static final String CONTEUDO_DICA = "conteudo";
    private final SQLiteDatabase database;

    public DicaBDHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);

            this.database = getWritableDatabase();
    }

    private static boolean haveDB(Context context, String dbName) {
        File dbFile = context.getDatabasePath(dbName);
        return dbFile.exists();
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        String createDicaTable = "CREATE TABLE " + TABLE_NAME + "( " +
                ID_DICA + " INTEGER UNSIGNED PRIMARY KEY," +
                CHANNEL_DICA + " TEXT NOT NULL," +
                TITULO_DICA + " TEXT NOT NULL," +
                CONTEUDO_DICA + " TEXT NOT NULL" + ")";
        database.execSQL(createDicaTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int i, int j) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        database.execSQL(sql);
        //this.onCreate(database);
    }
}
选择1 使用onCreate创建多个表:-

@Override
public void onCreate(SQLiteDatabase database) {
    String createDicaTable = "CREATE TABLE " + TABLE_NAME + "( " +
            ID_DICA + " INTEGER UNSIGNED PRIMARY KEY," +
            CHANNEL_DICA + " TEXT NOT NULL," +
            TITULO_DICA + " TEXT NOT NULL," +
            CONTEUDO_DICA + " TEXT NOT NULL" + ")";
    database.execSQL(createDicaTable);

    // Next table
    String createanothertable = "CREATE TABLE anothertable (column TEXT)";
    database.execSQK(createanothertable);
    // etc
}
注意!onCreate仅在数据库不存在时自动运行

选择2 Create subsequentmissing表假定独立于其他表,而不必删除现有表

按需运行,或者每次运行应用程序时,如果不存在,则执行代码

注意!假设已将方法添加到Databasehelper so db

注意!在获取DatabaseHelper实例后使用不应该是问题,因为this.database=getWritableDatabase;如果数据库不存在,将强制DatabaseHelper创建数据库

如果onCreate中的表不存在,也可以编写代码,并以类似的方式调用它


您是如何创建这些表的?@njzk2
更新了帖子haveDB有什么问题?如果两个数据库的名称相同,请在同一个帮助程序中创建表,或者使用不同的数据库名称。无论何时调用onCreate,都应同时创建所有表。您可以选择在当时使用初始/默认值填充表。一个活动将与整个数据库交互,而不仅仅是一个表,因此活动的顺序永远不会影响数据库的创建方式,而只是表的使用顺序。这看起来就像我在haveDB方法中所做的一样,问题是在何处使用验证。无法在构造函数中执行此操作。我尝试了第一个选项。因此,在每个DB类的onCreate上,我创建了其他表以及当前的classe表。是吗?@NelsonSilva Yep,选项2和独立性受到警告,因为表在添加之前不存在,因此在添加表时需要额外的代码。前者是常态。
@Override
public void onCreate(SQLiteDatabase database) {
    String createDicaTable = "CREATE TABLE " + TABLE_NAME + "( " +
            ID_DICA + " INTEGER UNSIGNED PRIMARY KEY," +
            CHANNEL_DICA + " TEXT NOT NULL," +
            TITULO_DICA + " TEXT NOT NULL," +
            CONTEUDO_DICA + " TEXT NOT NULL" + ")";
    database.execSQL(createDicaTable);

    // Next table
    String createanothertable = "CREATE TABLE anothertable (column TEXT)";
    database.execSQK(createanothertable);
    // etc
}
public void addMissingTables() {
    String createanothertable = "CREATE TABLE IF NOT EXISTS anothertable (column TEXT)";
    database.execSQL(createanothertable);
    // etc
}