如何清理/删除greenDao数据库

13

目前我是这样做的:

DaoMaster.dropAllTables(getDb(), true);
DaoMaster.createAllTables(getDb(), true);

但是,当我尝试向数据库添加实体时,出现了崩溃日志,说这个表不存在。

编辑1:我知道这是因为数据库被锁定且表尚未创建。所以我将这个问题简化为另一个问题——如何知道在GreenDao/Sqlite中表是否被锁定?

6个回答

14

那么对于每个表格,使用类似这样的东西如何?

daoSession.getSometableDao().deleteAll();

1
如果将来添加新表,您可能会忘记添加额外的调用... - ODAXY

6

到目前为止,我不会担心表是否被锁定;在我的情况下,我执行以下操作并且它有效:

首先,在App.onCreate执行时,我进行标准初始化。

    T.devOpenHelper= new DaoMaster.DevOpenHelper(context, "mydatabase", null);
    T.sqLiteDatabase= T.devOpenHelper.getWritableDatabase();
    T.daoMaster= new DaoMaster(T.sqLiteDatabase);
    T.daoSession= T.daoMaster.newSession();
    T.dao_myEntity= T.daoSession.getMyEntityDao();

在未来的某个时刻,我会像您一样删除并重新创建所有表:
    T.daoMaster.dropAllTables(T.sqLiteDatabase, true);
    T.daoMaster.createAllTables(T.sqLiteDatabase, true);

但在我的情况下,我可以立即插入一个新实体:

    MyEntity e= new MyEntity();
    e.setId_ticket(1L);
    e.setDescription("wololo");
    long id= T.dao_myEntity.insert(e);
    Log.d(G.tag, "T.erase_all: id: " + id); // prints "T.erase_all: id: 1"

我希望这能对您有所帮助。

2
请问,这里的T是什么意思? - Dan Chaltiel

2
public static void clearDatabase(Context context) {
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(
                context.getApplicationContext(), Constants.SQL_DB_NAME, null);
        SQLiteDatabase db = devOpenHelper.getWritableDatabase();
        devOpenHelper.onUpgrade(db,0,0);
    }

2
现在可以这样做:
for (AbstractDao abstractDao : mDaoSession.getAllDaos()){
    abstractDao.deleteAll();
}

0

我将build.gradle中的schemaVersion升级以通过这个错误


-2

试试这个:

QueryBuilder<cart> qb = SQLConfig.cartDao.queryBuilder();
List<cart> mUpadateData = qb.where(cartDao.Properties.Product_sku.eq(skuApi)).list();
SQLConfig.cartDao.deleteInTx(mUpadateData);

只有清理cartDao表格。 - Nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接