sqlite中数据存在更新,数据不存在添加的语句怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite中数据存在更新,数据不存在添加的语句怎么写相关的知识,希望对你有一定的参考价值。

这里我们要用Cursor中的getCount()方法去获得表中数据的行数(即,是否有数据)
注意!此方法返回值是int型,为数据行数,有数据则大于等于1无数据则为0,
拿到查询回来的行数后在java代码中判断是否为0,即是否有数据!看下面代码:
//创建或者打开数据库

SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
//实例化一个Cursor 为c做查询

Cursor c=db.rawQuery("select * from person where id=1",null);
int re = c.getCount();//定义一个int型变量re接收查询行数的返回值
//对re(数据行数)进行判断,为0执行下面insert,非0执行update if(re==0)
db.execSQL("insert into person(id,name,password) values(1,2,3)");
else
db.execSQL("update person set name=? ,password=? where id=1",new Object[]name,password);

基本每一行都有注释,纯手打。SQL语句改一下即可套用
参考技术A ///sqlite数据表建立唯一限制就行了么///sql代码如下:CREATE TABLE "main"."film" ("filmno" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"filmname" TEXT(100),"language" TEXT(10),"type" TEXT(10),CONSTRAINT "不重复规则" UNIQUE ("filmnam...本回答被提问者和网友采纳

如果不存在,Android SQLite 会有效地添加大量数据

【中文标题】如果不存在,Android SQLite 会有效地添加大量数据【英文标题】:Android SQLite efficiently add lots of data if not exists 【发布时间】:2012-11-12 13:27:13 【问题描述】:

我有下面描述的场景,我的问题是:

如何提高效率? 我可以改进表结构吗? 我可以改进查询/数据访问和写入吗?

目前它每秒可以解析大约 100 个对象。

编辑:通过在“案例 1:”上添加 InsertHelper,现有值的速度提高了,这主要是这种情况。但是,当您需要“last_insert_rowid()”时,我找不到任何有关如何使用它的资源

数据库结构:

data 
  id integer primary key autoincrement
  name text not null
  ...


reference 
  id integer (same id as in table1, not unique here tho)
  source text not null
  source_id text not null

表“引用”保留来自源的引用和源中的 id 到我的数据库中的 id。 “数据”表中的每个条目在“参考”表中至少有一个条目。

我在流中有一个 JSON,我一次解析和构建一个对象。流可以高达几 MB,包含超过 8000 个对象。构建对象时,它将包含一个引用。

对于我想要构建的每个对象:

if(reference for this object does not exist)
  if(we find the object name in data)
    add to reference with the found id then break
  else
    add to data, get new id, add to reference then break

代码看起来像(有点伪代码以便于阅读):

beginTransaction();
try 
  while(parsing next object is successful)
    if("SELECT 1 FROM reference WHERE source = ? and source_id = ?" == null)
      Object[] objects = "SELECT * FROM data WHERE name = ?"
      switch(objects.length)
        case 0:
          "INSERT INTO data (name) VALUES(?)"
          "INSERT INTO reference  (id, source, source_id) VALUES (last_insert_rowid(), ?, ?)"
          break;
        case 1:
          "INSERT INTO reference  (id, source, source_id) VALUES (?, ?, ?)"
          break;
      
    
  
  setTransactionSuccessful();
 finally 
  endTransaction();

【问题讨论】:

【参考方案1】:

您可以进入异步模式以获得更快的操作。 打开你的 sqlite 后,执行这个查询:

yourdb.execSQL("PRAGMA synchronous = OFF");

当您完成插入所需的所有内容后,通过简单的关闭/重新打开来刷新数据库:

public synchronized SQLiteDatabase flush() 
    if (database != null && database.isOpen()) 
        database.close();
        database = helper.getWritableDatabase();
        return database;
    
    return database;

希望这会有所帮助。

【讨论】:

【参考方案2】:

您可以通过在查找字段上创建索引来加速SELECT 查询(如果您还没有索引)。

包装 SQL INSERT 命令的所有函数(SQLiteDatabase.insertInsertHelper.execute)返回插入记录的 rowid

【讨论】:

以上是关于sqlite中数据存在更新,数据不存在添加的语句怎么写的主要内容,如果未能解决你的问题,请参考以下文章

sqlite如何添加新字段

SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users

MySQL新增数据,存在就更新,不存在就添加

SQLite 中的“如果不存在则插入”语句

mysql批量更新,数据存在则更新,不存在则插入

SQLITE - 在 INSERT 上设置默认值