GVKun编程网logo

android – SQLite – 是否可以通过insert语句插入BLOB?

10

在这里,我们将给大家分享关于android–SQLite–是否可以通过insert语句插入BLOB?的知识,同时也会涉及到如何更有效地androidSQLiteInsertOrUpdate的使用、an

在这里,我们将给大家分享关于android – SQLite – 是否可以通过insert语句插入BLOB?的知识,同时也会涉及到如何更有效地android SQLite InsertOrUpdate的使用、android sqlite检查是否插入新值、android – Service.onStartCommand() – 是否可以返回多个标志?、android – SQLite.insert返回-1但数据插入数据库的内容。

本文目录一览:

android – SQLite – 是否可以通过insert语句插入BLOB?

android – SQLite – 是否可以通过insert语句插入BLOB?

我正在开发一个 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')",name) values(BITMAP2,'2.jpg')",name) values(BITMAP3,'3.jpg')"}    

}

任何帮助将会很多,

谢谢,
Tulio Zahn

解决方法

如果你真的,真的希望你可以使用一个非常长的十六进制文字作为一个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,"2.jpg");
p.execute();

(警告—代码未测试.)

一般来说,您应该在任何地方使用参数化查询,因为它们是一种可靠的方式来避免sql注入攻击,另外通常更容易和更清晰.应该不惜一切代价避免将字符串混合在一起来组合SQL查询.

android SQLite InsertOrUpdate的使用

android SQLite InsertOrUpdate的使用

  在SQL中,是支持insertOrUpdate的,但在android SQLite中并不支持了,那我们怎么办呢?很简单

  比如有以下表结构:


  其中,id是自动增长的索引,注意,现在很关键:

  如果你想name值存在时,更新这条记录,不存在时增加一条记录,那么你就设name为唯一索引; 这样就能实现我们的目标。
  例如:

replace into test(name,age) values(''zs'',22)
replace into test(name,age) values(''zs'',22)
replace into test(name,age) values(''zs'',22)


  执行上述语句后你会发现,后两条的作用是update(其实它是先delete,后insert)的

  我的博客其它文章列表
  http://my.oschina.net/helu

android sqlite检查是否插入新值

android sqlite检查是否插入新值

我正在使用sqlite.我成功创建了数据库和表.我还编写了可以在我的表中插入新值的代码.我的代码工作正常,但现在我想显示例如:如果插入新值,则显示toast消息,否则在toast或其他内容中显示错误消息.
这是我对表源代码的插入:

public void InsertToPhysicalPersonTable(String FirstName, String LastName,
        String FullName, String FatherName) {
    try {
        ContentValues newValues = new ContentValues();
        newValues.put("FirstName", FirstName);
        newValues.put("LastName", LastName);
        newValues.put("FullName", FullName);
        newValues.put("FatherName", FatherName);



        db.insert(AddNewPhysicalPerson, null, newValues);
    } catch (Exception e) {
        // Todo: handle exception
        e.printstacktrace();
        Toast.makeText(myContext, "Something wrong", Toast.LENGTH_SHORT).show();
    }

}

我这样调用我的函数:

loginDataBaseAdapter.InsertToPhysicalPersonTable("FirstName",
                    "LastName",
                    "FullName",
                    "FatherName"
                    );

如果有人知道解决方案,请帮助我.
谢谢

解决方法:

insert()方法返回新插入行的行ID,如果发生错误则返回-1.

更改

db.insert(AddNewPhysicalPerson, null, newValues);

像这样

long rowInserted = db.insert(AddNewPhysicalPerson, null, newValues);
if(rowInserted != -1)
    Toast.makeText(myContext, "New row added, row id: " + rowInserted, Toast.LENGTH_SHORT).show();
else
    Toast.makeText(myContext, "Something wrong", Toast.LENGTH_SHORT).show();

android – Service.onStartCommand() – 是否可以返回多个标志?

android – Service.onStartCommand() – 是否可以返回多个标志?

我必须确保我的服务将运行,直到我明确调用stopService().
所以我应该从onStartCommand()返回START_STICKY标志.

我也希望如果我的服务将被系统销毁,因为内存不足,当系统重新创建它时 – onStartCommand()将以最初启动服务的相同意图被调用.
因为这个原因 – 我想使用START_FLAG_REDELIVERY标志.
根据文档 – http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle,我所描述的肯定会发生(实际上发生在我身上)

我知道我可以使用startForground()启动服务,这可以防止服务在内存不足时被系统杀死,但我不想使用这种方法,无论如何 – 根据文档:系统仍然可以在极低的记忆压力下杀死它.

所以如果我可以从onStartCommand()返回它将是完美的
START_STICKY | START_FLAG_REDELIVERY

但根据文档,你似乎只能使用其中一个标志(也许我错了?).

那么有可能以某种方式开始以我描述的方式工作的服务吗?

解决方法

你不能返回多个值.相反,我建议你在onStartCommand中返回START_STICKY标志.但这是第一次将intent的bundle的必要值保存在SharedPreference存储中.下次,当你重新调用onStartCommand(从低内存或任何原因恢复后)并且发现intent为null时,只需从首选项加载值并继续使用你想要的任何内容.

android – SQLite.insert返回-1但数据插入数据库

android – SQLite.insert返回-1但数据插入数据库

我有这样的方法:

protected long put(String tableName,ContentValues values) {
     sqliteDatabase db = (!mInTransaction) ? mHelper.getWritableDatabase() : mDb;
     long success = db.insert(tableName,null,values);
     return success;
}

此方法返回-1但数据已插入数据库.我检查了我的数据,没关系.任何人都可以帮助我:(

这是我的表:

CREATE TABLE选项(category_no INTEGER NOT NULL,subcategory_no INTEGER NOT NULL,quiz_no INTEGER NOT NULL,choice_no INTEGER NOT NULL,answer TEXT NOT NULL,content_id INTEGER NOT NULL,PRIMARY KEY(category_no,quiz_no,choice_no));

解决方法

如果发生错误,则返回-1. .insert(…)返回新插入记录的行ID.这很重要吗?你的数据库中有_id字段吗?

关于android – SQLite – 是否可以通过insert语句插入BLOB?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android SQLite InsertOrUpdate的使用、android sqlite检查是否插入新值、android – Service.onStartCommand() – 是否可以返回多个标志?、android – SQLite.insert返回-1但数据插入数据库等相关知识的信息别忘了在本站进行查找喔。

本文标签: