【问题标题】:SQLite - Is it possible to insert a BLOB via insert statement?SQLite - 是否可以通过插入语句插入 BLOB?
【发布时间】:2012-02-11 15:11:44
【问题描述】:

我正在开发一个 Android 应用程序,我正在使用 Sqlite 数据库来存储一些位图。我希望在用户安装应用程序时自动插入一些图像。

我正在像这样使用 SQLiteOpenHelper 类:

public class DatabaseHelper extends SQLiteOpenHelper {

...

DatabaseHelper(Context context, String nameOfDB, int version, String[] scriptSQLCreate,
        String scriptSQLDelete) {
    super(context, nameOfDB, null, version);

    this.scriptSQLCreate = scriptSQLCreate;
    this.scriptSQLDelete = scriptSQLDelete;
}

@Override
public void onCreate(SQLiteDatabase db) {
    int numScripts = scriptSQLCreate.length;
    for(int i = 0; i<numScripts; i++){
    Log.i(TAG,"Creating database, executing script " + i);
    db.execSQL(scriptSQLCreate[i]);
    }
}
}

...

我想将一个常量传递给上面显示的 scriptSQLCreate 参数,如下所示:

private static final String[] SCRIPT_DATABASE_CREATE = {
   "create table memes(  id integer primary key autoincrement," + 
                     + " img blob not null," + 
                     + " name text not null unique)" ,
   "insert into memes(img,name) values(BITMAP1,'1.jpg')",
   "insert into memes(img,name) values(BITMAP2,'2.jpg')",
   "insert into memes(img,name) values(BITMAP3,'3.jpg')"}    

}

任何帮助将不胜感激,

谢谢, 图里奥·扎恩

【问题讨论】:

    标签: android database sqlite bitmap blob


    【解决方案1】:

    如果你真的非常想要,你可以使用很长的十六进制文字作为 blob 文字:

    insert into memes(img, name) values(X'0102030405060708090a0b0c0d0e0f', '1.jpg')
    

    但是,这通常是个坏主意;相反,去看看parameterised queries。他们将让您使用占位符而不是实际值编译一次语句,然后多次重复使用它,根据需要填写占位符:

    SQLiteStatement p = sqlite.compileStatement("insert into memes(img, name) values(?, ?)");
    
    byte[] data = loadData("1.jpg");
    p.bindBlob(1, data);
    p.bindString(2, "1.jpg");
    p.execute();
    
    byte[] data = loadData("2.jpg");
    p.bindBlob(1, data);
    p.bindString(2, "2.jpg");
    p.execute();
    

    (警告 --- 代码未测试。)

    一般来说,您应该在任何地方使用参数化查询,因为它们是避免 SQL 注入攻击的可靠方法,而且通常更容易和更清晰。应不惜一切代价避免通过将字符串粘合在一起来组装 SQL 查询。

    【讨论】:

    • 嗯,你的方法绝对有趣。如果需要使用数百个位图而不是几个位图预填充数据库,则更是如此。在这种情况下,拥有数百个插入语句变得非常不切实际。我会测试你的方法,但首先我必须想出一个解决方案来解决将所有这些图像放在哪里的问题。在有很多的情况下,仅仅将它们放在drawable文件夹中似乎也很不切实际
    • 您想要的是项目中的资产目录 --- 有一个 API 可以让您访问那里的文件,就好像它们是文件系统上的真实文件一样:developer.android.com/reference/android/content/res/…
    【解决方案2】:

    您的数据表中有一些您看不到的隐形字。使用 db 工具(如用于 sqlite 的 navicat)检查您的 db 文件。请注意表中的错误词。

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多