Я пытаюсь создать приложение для Android с предварительно заполненной базой данных. Узнав о том, как это сделать, я наткнулся на статью http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/, которая в основном берет существующую базу данных sqlite и направляет ее в нужное место на устройстве Android. Данные, с которыми я работал, были обработаны в ruby, поэтому я взял гем sqlite и создал базу данных примерно так.
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();
}
}
Я могу с этим справиться, но, похоже, мне не следовало этого делать. Кто-нибудь еще сталкивался с этим или знает, что я делаю не так?