在android中,使用getBlob检索sqlite文本字段,而不是getString

时间:2011-02-05 20:42:45

标签: android ruby sqlite

我正在尝试使用预先填充的数据库创建一个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();
    }
}

我可以解决这个问题,但似乎我不应该这样做。还有其他人遇到过这个,或者知道我做错了什么?

0 个答案:

没有答案