【发布时间】:2010-09-23 15:37:49
【问题描述】:
如果我的应用程序不存在,我将在运行时为它创建我的 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
私有静态最终字符串 USERAUTH_TABLE_CREATE = "创建表" + USERAUTH_TABLE_NAME + " (" + “数字整数不为空,”+ "dip TEXT NOT NULL," + “电子邮件文本不为空,”+ "密码文本不为空," + "标志整数" + ");" ;
查询文本字符串#2
private static final String USERPREF_TABLE_CREATE =
"CREATE TABLE " + USERPREF_TABLE_NAME + " (" +
"tpd TEXT NOT NULL ," +
"cat TEXT NOT NULL" + ");";
【问题讨论】:
-
这可能相关也可能不相关,但无论哪种方式都可能有所帮助:code.google.com/p/android/issues/detail?id=1732。
-
谢谢查理..有用的信息。我将尝试在一次调用中实现表创建。
-
您是否检查过 sqlite 文件(数据库)是否实际上是在文件系统上创建的(通过 DDMS 或 telnet 模拟器)?如果是,您可以将文件从模拟器复制到您的桌面,并使用 SQLitebrowser 检查您的表是否已创建。