如果我的应用程序不存在,我将在运行时为其创建 SQLite 数据库,如果存在则插入行。因为它应该在运行时创建,所以我通过创建 SQLiteOpenHelper 的子类并重写 onCreate() 方法来实现它 -
“我需要在项目的/assets 文件夹中放入任何内容吗?”
我没有使用任何内容提供程序“我需要在 AndroidManifest.xml 中添加任何标签吗?”
这就是我所做的。字符串已正确定义,我没有收到任何运行时异常。
SQLiteOpenHelper 子类的实现。
public class MyDB extends SQLiteOpenHelper {
public MyDB(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION );
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(USERAUTH_TABLE_CREATE);
db.execSQL(USERPREF_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
Log.w("Example", "Upgrading database, this will drop tables and
recreate.");
db.execSQL("DROP TABLE IF EXISTS " + USERAUTH_TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + USERPREF_TABLE_NAME);
onCreate(db);
}
}
这里是我创建 SQLiteOpenHelper 的 MyDB 子类实例的地方。
MyDB tdb = new MyDB(Activity.this);
SQLiteDatabase db = tdb.getReadableDatabase();
当我进入 sqlite shell 并编写以下查询时,一切都会运行
select * from table_name - 它只是告诉我不存在这样的记录。我设置了断点,似乎在调用 getReadableDatabase() 后,@Override OnCreate() 方法永远不会执行,这是我执行创建表 SQL 的地方。我尝试过 getWritableDatabase() 以及。
我不明白为什么没有创建表。如果有人能提供帮助那就太好了。
谢谢。
查询文本字符串#1
私有(private)静态最终字符串 USERAUTH_TABLE_CREATE = “创建表”+ USERAUTH_TABLE_NAME +“(”+ “数字整数不为空,”+ “浸文本不为空,”+ “电子邮件文本不为空,”+ “密码文本不为空,”+ “标志整数”+“);” ;
查询文本字符串#2
private static final String USERPREF_TABLE_CREATE =
"CREATE TABLE " + USERPREF_TABLE_NAME + " (" +
"tpd TEXT NOT NULL ," +
"cat TEXT NOT NULL" + ");";
最佳答案
如果 onCreate()
未被调用,则数据库已为您的应用创建。解决该问题的最快方法是删除模拟器上的项目(设置 --> 应用程序 --> 您的应用程序),然后重新启动您的应用程序。或者,您可以使用 ADB 来删除您的数据库——这取决于您。删除数据库后重新启动应用程序将调用onCreate()
,因为数据库不存在,然后将运行您的建表sql。仅当您的数据库不存在时才会调用 onCreate()
(因此几乎是您第一次在代码中调用数据库时。
关于android - 为 Android 应用程序创建 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780001/