过去几天我一直在通过我的第一个Android数据库实现工作。
今天,我一直在尝试实现SQLiteOpenHelper。来自onCreate();方法我可以成功创建新数据库(yay)。
我遇到的问题是:这适用于已经可用于iOS的应用。 iOS数据库版本为5.如果我最初将此Android数据库设置为5,则不会从onUpgrade();运行任何迁移方法。所以我尝试从onCreate()方法运行这些方法方法。迁移方法基本上设置了一些默认值,并向数据库添加了一些索引。
但是,每当我尝试运行一个插入命令时,我就会在logcat中获得无休止的GC_CONCURRENT释放...读取,并且我的UI永远不会通过一些准系统结构(即背景和操作栏)。
以下是我正在做的事情:
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG, "creating database and tables.");
// * Execute create tables
db.execSQL(CREATE_TABLE_LANDMARKS);
db.execSQL(CREATE_TABLE_FAVORITES);
db.execSQL(CREATE_TABLE_FRIENDS);
db.execSQL(CREATE_TABLE_WISHLIST);
migrateDatabaseToVersion_1(db);
Log.d(LOG, "finished creating database and tables");
}
private void migrateDatabaseToVersion_1(SQLiteDatabase db) {
ContentValues landmarkValues = new ContentValues();
landmarkValues.put(COLUMN_PCI, "initial");
landmarkValues.put(COLUMN_PRI, 1);
landmarkValues.put(COLUMN_LANDMARK_NAME, "w_monument");
landmarkValues.put(COLUMN_LANDMARK_COORDINATE_X, "38.8895 N");
landmarkValues.put(COLUMN_LANDMARK_COORDINATE_Y, "77.0352 W");
landmarkValues.put(COLUMN_LANDMARK_NUMBER_OF_VISITS, 0);
landmarkValues.put(COLUMN_LANDMARK_FAVORITE, 0);
landmarkValues.put(COLUMN_LANDMARK_EST, "1970-01-01");
landmarkValues.put(COLUMN_LANDMARK_TAG, "washington");
landmarkValues.put(COLUMN_LANDMARK_NOTES, "type notes here");
landmarkValues.putNull(COLUMN_LANDMARK_PHOTO);
landmarkValues.put(COLUMN_LANDMARK_COMMON_NAME, "Washington Monument");
landmarkValues.put(COLUMN_LANDMARK_DELETED, 0);
long landmarkId = db.insert(TABLE_LANDMARKS, null, landmarkValues);
if (landmarkId != 0) {
Log.d(LOG, "default landmark data inserted");
}
}
我整天都在这里工作,似乎无法解决问题。我尝试不使用ContentValues类,只是运行db.execSQL,但我收到了相同的结果:在Logcat中释放了一个永不停止的CG_CONCURRENT流...我的UI没有加载......没有崩溃,什么也没有 - 而且onCreate()方法永远不会完成。
非常感谢任何帮助。
答案 0 :(得分:0)
我只是做错了 - 一个新手的错误。切换到使用Loaders和LoaderManager,现在一切正常。
问题可能与尝试同时读取和写入数据库有关。