繁体   English   中英

检查SQLite中是否存在数据库

[英]Check if database exists in sqlite

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

日志:

12-25 00:30:28.024 32031-32031 / com.support.android.iplfit E / AndroidRuntime:致命例外:主进程:com.support.android.iplfit,PID:32031 android.database.sqlite.SQLiteException:无此类表:Dica(代码1):,编译时:从Dica在android.database.sqlite.SQLite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)在android.database.sqlite.SQLite.SQLiteConnection.nativePrepareStatement(本机方法)在android.database .sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)在android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)在android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:58)在android.database .sqlite.SQLiteStatement。(SQLiteStatement.java:31)位于android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1499)位于com.support.android.iplfit.BDHelpers.DicaBDHelper.removerAllDicasBD(DicaBDHelper.java:73) com.support.and上的com.support.android.iplfit.Singletons.SingletonDicas.adicionarDicasBD(SingletonDicas.java:65) roid.roid.iplfit.Singletons.SingletonDicas $ 1.onResponse(SingletonDicas.java:83)位于com.support.android.iplfit.Singletons.SingletonDicas $ 1.onResponse(SingletonDicas.java:77),位于com.Junior.volley.toolbox.com。 com.android.volley.ExecutorDelivery $ ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)的android.os.Handler.handleCallback(Handler.java:751)的android.os.Handler.dispatchMessage的deliveryResponse(JsonRequest.java:65) (Handler.java:95)在android.os.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(ActivityThread.java:6077)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:866)在com.android.internal.os.ZygoteInit.main(ZygoteInit.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

创建后续(缺失)表(假定与其他表具有独立性),而不必删除现有表。

根据需要运行或每次运行App时运行(因此代码IF NOT EXISTS )。

public void addMissingTables() {
    String createanothertable = "CREATE TABLE IF NOT EXISTS anothertable (column TEXT)";
    database.execSQL(createanothertable);
    // etc
}
  • 注意! 假定方法已添加到Databasehelper(so db)

  • 注意! 获取DatabaseHelper实例后应该不会有问题,因为this.database = getWritableDatabase(); 如果数据库不存在,将强制DatabaseHelper创建数据库。

  • 您还可以在onCreate为表编写“ IF NOT EXISTS代码,并以类似的方式调用它。

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH(DB_FULL_PATH is the path to your database file), null,
                SQLiteDatabase.OPEN_READONLY);
        checkDB.close();
    } catch (SQLiteException e) {
        // database doesn't exist yet.
    }
    return checkDB != null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM