我正在尝试使用预先填充的数据库创建一个Android应用程序。在了解如何解决此问题时,我遇到了这篇文章http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/,它基本上采用了现有的sqlite数据库并将其流式传输到Android设备上的正确位置。我用的数据是用ruby处理的,所以我抓住了sqlite gem,并创建了一个像这样的数据库。
db = SQLite3::Database.new( "cards.db" )
db.execute("CREATE TABLE android_metadata (locale TEXT DEFAULT \"en_US\")")
db.execute("INSERT INTO android_metadata VALUES (\"en_US\")")
db.execute("
CREATE TABLE #{@@card_table_name} (
_id INTEGER PRIMARY KEY,
name TEXT UNIQUE
)")
cards.each do |card|
begin
db.execute("INSERT INTO #{@card_table_name} (_id, name) VALUES (?, ?)",
card.id, card.name)
rescue => e
puts "#{card.name} (#{card.id})"
puts e
end
end
当我进入数据库时,无论是使用ruby脚本创建的数据库,还是使用adb并在模拟器上检查数据库的数据库,我都可以获得该模式。
sqlite> .schema
CREATE TABLE Cards (
_id INTEGER PRIMARY KEY,
name TEXT UNIQUE
);
但是,当我在我的应用程序中取回数据时,getString无法处理该名称,具体而言,此块进入异常子句,并在该块中成功打印名称
Cursor cursor = myDataBase.query("Cards", new String[] {"_id", "name"}, null, null, null, null, null, "5");
while (cursor.moveToNext()) {
try {
cards.add(new Card(cursor.getInt(0), new String(cursor.getString(1))));
} catch (Exception e) {
byte[] blob = cursor.getBlob(1);
String translated = new String(blob);
Log.i(MagicApp.TAG, "DB retrival blew up on " + cursor.getInt(0) + ", " + blob + " : " + translated);
e.printStackTrace();
}
}
我可以解决这个问题,但似乎我不应该这样做。还有其他人遇到过这个,或者知道我做错了什么?