在/values/arrays.xml中,我有一個數組,其中包含我想要插入到sqlite數據庫中的值。如何從數組資源填充數據庫?
在onCreate中,我試圖獲取該數組並運行for循環,直到i =數組的長度,然後使用db.execSQL(「INSERT INTO ...或可能initialValues.put(...
不過,我似乎無法給getResources()中的onCreate,所以我甚至不知道這是否會工作,是否有人知道如何最好地做到這一點
在/values/arrays.xml中,我有一個數組,其中包含我想要插入到sqlite數據庫中的值。如何從數組資源填充數據庫?
在onCreate中,我試圖獲取該數組並運行for循環,直到i =數組的長度,然後使用db.execSQL(「INSERT INTO ...或可能initialValues.put(...
不過,我似乎無法給getResources()中的onCreate,所以我甚至不知道這是否會工作,是否有人知道如何最好地做到這一點
這似乎有你以後有什麼。? http://developer.android.com/guide/topics/resources/string-resource.html#StringArray
保存在res/values/strings.xml中的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
然後就是不斷的循環正常
如果我得到這個直,你想從將對DBAdapter添加這些初始值。我看不出爲什麼你不應該把這個程序移到主類。我喜歡讓dbAdapter的方法嚴格與創建/讀取/寫入數據庫相關,然後在主Activity中填充列表。您也可以直接訪問資源。
作爲性能增強劑,你應該儘量使插入的所有記錄在一個聲明中,如
db.rawQuery("INSERT INTO tableName(column1, column2) VALUES (valA1, valA2), (valB1, valB2) ....
您可以通過簡單的字符串操作,而迭代陣列上使這個查詢字符串。祝你好運! :-)
如果我把它放在主類中,每次運行應用程序都會觸發它。這些是在創建數據庫時應該填充的初始值,這就是爲什麼他們在db的onCreate上。用戶可以自由刪除這些值,所以我不想將它們放入。我誤解了這是如何工作的? – Roger 2011-04-17 14:22:09
那麼,這取決於你如何實現它。但是,我並不完全確定SQLite數據庫的生命週期,所以將它保留在原來的位置可能是一個好主意。我看到你無法獲得上下文,這是我們可以解決的問題。假設你在你提供的鏈接中使用了代碼,你所要做的就是向dbAdapter添加'private Context context',並在構造函數中將它設置爲this:'this.context = context;'如果你願意,請告訴我'有這個問題。 :-) – pecka85 2011-04-17 15:55:53
我需要做同樣的事情。我假設你知道如何使數據庫輔助類擴展SQLiteOpenHelper
,所以我不會進入這一點。這用於在安裝應用程序時創建或更新數據庫。當這個類被稱爲你通過它Context
。創建另一個類級別的變量來保存上下文,然後在構造函數中初始化它。然後你使用上下文到getResources()
從中你可以得到數組來填充你的數據庫。
private static class DatabaseHelper extends SQLiteOpenHelper {
private final Context fContext;
// constructor
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
fContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
+ FIRST_COLUMN + " INTEGER PRIMARY KEY,"
+ SECOND_COLUMN + " TEXT NOT NULL,"
+ THIRD_COLUMN + " INTEGER,"
+ FOURTH_COLUMN + " TEXT NOT NULL"
+ ");");
// Initialize the db with values from my_array.xml
final int DEFAULT_THIRD_COLUMN = 1;
final String DEFAULT_FOURTH_COLUMN = "";
ContentValues values = new ContentValues();
Resources res = fContext.getResources();
String[] myArray = res.getStringArray(R.array.my_array);
for (String item : myArray){
values.put(SECOND_COLUMN, item);
values.put(THIRD_COLUMN, DEFAULT_THIRD_COLUMN);
values.put(FOURTH_COLUMN, DEFAULT_FOURTH_COLUMN);
db.insert(TABLE_NAME, null, values);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
如需更多幫助,請參閱this link:
我似乎無法得到解決「的方法getResources()是未定義」任何想法? – Roger 2011-04-17 01:48:12
嗯,你可以顯示相關的代碼?它只是在您的Apps主要活動onCreate? getResources是上下文的一種方法。您應該能夠使用來自活動的this.getResources(),或者如果它在另一個類中傳遞上下文並嘗試context.getResources()。希望有幫助嗎? – wired00 2011-04-17 03:39:22
它在我的DbAdapter類中,這裏是我正在使用的文件... http://code.google.com/p/android-helloworld-samples/source/browse/trunk/Notepadv3/src/com/ android/demo/notepad3/NotesDbAdapter.java?r = 28 – Roger 2011-04-17 04:24:43