SQLiteOpenHelper的onCreate方法没有被调用

3

即使卸载并重新安装应用程序,onCreate方法仍未被调用。

Database.java:

public class Database extends SQLiteOpenHelper {
    public static SQLiteDatabase db;
    public Database(Context context) {
        super(context,"db", null, 1);
        Log.i("DB", "dbManager");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.i("DB", "dbOnCreate");
        String s = "CREATE TABLE test(id INTEGER);";
        db.execSQL(s);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        Log.i("DB", "dbOnUpgrade");
    }
}

我称之为:

Database db = new Database(this);

输出:

07-17 12:42:03.053 16448-16448/com.package.app I/DB: dbManager

这个问题是什么,如何解决?


是的,它有,阅读被接受的答案。 - Selvin
@Selvin 在不知道 OP 是否调用了 getReadableDatabase 或 getWritableDatabase 的情况下,它被标记为重复。OP 没有展示他所有的代码...那么怎么能知道呢? - Willi Mentzel
@selvin 我的问题是:onCreate方法从未被调用!无论是第一次运行还是重新安装应用后! - user4407794
1
@MohammadBahadori 在你的数据库构造函数中添加这行代码 getReadableDatabase(),它就会工作。只有在访问数据库进行写入或读取时才会触发更新。由于你没有尝试这样做,所以 onCreate 没有被调用。 - Willi Mentzel
@WilliMentzel的问题已经解决。非常感谢您!<3 - user4407794
显示剩余2条评论
3个回答

8
public class Database extends SQLiteOpenHelper {
    public static SQLiteDatabase db;
    public Database(Context context) {
        super(context,"db", null, 1);
        getReadableDatabase(); // <-- add this, which triggers onCreate/onUpdate
        Log.i("DB", "dbManager");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.i("DB", "dbOnCreate");
        // ...
    }
    // ...
}
解释: 只有在数据库被访问进行读写操作时才会触发更新。由于您没有尝试这样做,因此 onCreate 永远不会被调用。
通常,在某个地方调用您的 Database 类的方法(例如查询实体)就是 onCreate /(或者 onUpdate)被调用的时刻。
由于您现在没有这样的方法,所以只需在 Database 构造函数中调用它即可。 或者: 另一种更简洁的方法是在创建 Database 对象后立即调用 getReadableDatabase()
Database db = new Database(this);
db.getReadableDatabase();

1
@Override
public void onCreate(SQLiteDatabase db) {
   // ...
}

onCreate 当数据库第一次创建时调用。这是创建表和表的初始填充应该发生的地方。

尝试使用

String s = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY);";

卸载应用并重新运行。然后检查。

1
这是重新安装甚至在虚拟设备上第一次运行后的结果! - user4407794
在 /data/data/com.package.app 目录下,databases 文件夹不存在,因此数据库从未被创建! - user4407794
@MohammadBahadori 添加 getReadableDatabase() - IntelliJ Amiya
@IntelliJAmiya,你的代码有误。你应该使用由onCreate提供的db实例。同样适用于onUpdate。getReadableDatabase()应该在这些方法之外。 - Willi Mentzel
1
@WilliMentzel 好的 - IntelliJ Amiya

0

对于您的数据库类,必须调用getReadableDatabase()或getWritableDatabase()方法。

如果您想要写入/更新数据到您的数据库,请使用getWritableDatabase();如果您想要从数据库获取数据,请使用getReadableDatabase()

Database dbHelper = new Database(this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
SQLiteDatabase db = dbHelper.getWritableDatabase();

然后使用适当的方法来编写、获取、更新或删除数据库中的数据。 例如:

db.query("table_name", null, null, null, null, null, null);

我可以在类构造函数中获取getWritableDatabase吗?还是必须在MainActivity中调用? - user4407794

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