在/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