【问题标题】:How to insert only records to SQlite and ignore already exist records?如何仅向 SQlite 插入记录并忽略已存在的记录?
【发布时间】:2017-01-24 06:27:05
【问题描述】:

我正在从服务器向我的 sqlite 表中插入记录。它就像一个魅力和成功插入的记录。现在我想要的是,当用户下次第二次启动应用程序时,它会再次插入重复记录。

我只想插入可用的新记录并忽略已经存在的记录。

db.execSQL("Insert into myTable(ProjectNo,ProjectId,ThirdParty,SealingNumber,BookNumber,SupplyType,ConsAcNo,KnoNo,MeterSrMo,ConsName,ConsAddress1,ConsAddress2,ConsAddress3,TelephoneNo, ConsMobileNo,SanctionLoad, MeterMake, MeterType, PhaseType, IsCompleted, Contractor ") ) values ('" + c.getString("PROJECT_NUMBER") + "'," + c.getString("PROJECT_ID") + ",'" + c.getString("THIRD_PARTY") + "'," + c.getString("SEALING_NUMBER") + "," + c.getString("BOOK_NUMBER") + "," + c.getString("SUPPLY_TYPE") + "," + c.getString("CONS_ACCOUNT_NO") + "," + c.getString("KNO_NUMBER") + ",'" + c.getString("MTR_SERIAL_NO") + "','" + c.getString("CONS_NAME") + "','" + c.getString("CONS_ADDRESS1") + "','" + c.getString("CONS_ADDRESS2") + "','" + c.getString("CONS_ADDRESS3") + "','" + c.getString("TELEPHONE_NO") + "','" + c.getString("CONS_MOBILE_NO") + "','" + c.getString("SANCTION_LOAD") + "','" + c.getString("METER_MAKE") + "','" + c.getString("METER_TYPE") + "','" + c.getString("METER_PHASE") + "','N', '"+ c.getString("CONTRACTOR1") +"')");

我尝试了以下查询,但失败了。

db.execSQL("Insert into FieldUtilityData (ProjectNo,ProjectId,ThirdParty,SealingNumber,BookNumber,SupplyType,ConsAcNo,KnoNo,MeterSrMo,ConsName,ConsAddress1,ConsAddress2,ConsAddress3,TelephoneNo, ConsMobileNo,SanctionLoad, MeterMake, MeterType, PhaseType, IsCompleted, Contractor WHERE NOT EXISTS(SELECT  ConsAcNo FROM  FieldUtilityData WHERE ConsAcNo = " + c.getString("CONS_ACCOUNT_NO") + ") ) values ('" + c.getString("PROJECT_NUMBER") + "'," + c.getString("PROJECT_ID") + ",'" + c.getString("THIRD_PARTY") + "'," + c.getString("SEALING_NUMBER") + "," + c.getString("BOOK_NUMBER") + "," + c.getString("SUPPLY_TYPE") + "," + c.getString("CONS_ACCOUNT_NO") + "," + c.getString("KNO_NUMBER") + ",'" + c.getString("MTR_SERIAL_NO") + "','" + c.getString("CONS_NAME") + "','" + c.getString("CONS_ADDRESS1") + "','" + c.getString("CONS_ADDRESS2") + "','" + c.getString("CONS_ADDRESS3") + "','" + c.getString("TELEPHONE_NO") + "','" + c.getString("CONS_MOBILE_NO") + "','" + c.getString("SANCTION_LOAD") + "','" + c.getString("METER_MAKE") + "','" + c.getString("METER_TYPE") + "','" + c.getString("METER_PHASE") + "','N', '"+ c.getString("CONTRACTOR1") +"')");

【问题讨论】:

  • 维护一个 PRIMARY KEY 或具有 UNIQUE 约束的列。如果重复记录,它将抛出错误(primary constraint failed...)。

标签: android json database sqlite android-studio


【解决方案1】:
  public int getFullCount(String table, String where) {
        Cursor cursor = db.query(false, table, null, where, null, null, null, null, null);
        try {
            if (cursor != null) {
                cursor.moveToFirst();
                no = cursor.getCount();
                cursor.close();
            }
        } finally {
            cursor.close();
        }
        return no;
    }

使用这个函数并传递表名和条件。在插入检查计数之前,如果计数返回将大于0,则不添加记录,否则添加记录

【讨论】:

  • 他不想删除现有记录。他只想插入新的非重复记录,保持现有记录不变。
  • @MonishKamble 写着它会删除记录。您在哪里编写插入记录的代码。在此之前使用此功能获取计数。如果 count ==0 则插入记录,否则将其保留,因为如果 count >0 则表示记录已经存在
  • 如果计数大于 0,那么它也不会插入新的可用记录,我想插入新记录并忽略表中已有的记录。
  • 您是否从服务器端获取此信息?
  • 是的,我正在从服务器获取 json 并插入到 sqlite。
【解决方案2】:

使用 where 条件检查,如果匹配则更新表或插入。

这样做,

db.open();

        //for insert in db
        ContentValues cv = new ContentValues();
        cv.put("ProjectNo", "ProjectNo");
        cv.put("ProjectId", "ProjectId");
        cv.put("SealingNumber", "SealingNumber");
        cv.put("ConsAcNo", "ConsAcNo");
        cv.put("KnoNo", "KnoNo");
        cv.put("MeterSrMo", "MeterSrMo");
        cv.put("ThirdParty", "ThirdParty");
        cv.put("BookNumber", "BookNumber");
        cv.put("SupplyType", "SupplyType");
        cv.put("ConsName", "ConsName");
        cv.put("ConsAddress1", "ConsAddress1");
        cv.put("ConsAddress2", "ConsAddress2");
        cv.put("ConsAddress3", "ConsAddress3");
        cv.put("TelephoneNo", "TelephoneNo");
        cv.put("ConsMobileNo", "ConsMobileNo");
        cv.put("SanctionLoad", "SanctionLoad");
        cv.put("MeterMake", "MeterMake");
        cv.put("MeterType", "MeterType");
        cv.put("PhaseType", "PhaseType");
        cv.put("IsCompleted", "IsCompleted");
        cv.put("Contractor", "Contractor");

        //your where condition (change as per your requirement)
        String whereClause = "ProjectNo = " + "PROJECT_NUMBER" + " AND " + "ProjectId" + " = PROJECT_ID" + "AND "
            + "SealingNumber =" + "SealingNumber" + "AND" + " ConsAcNo = " + "ConsAcNo" + "AND" + "KnoNo = " + "KnoNo"
            + "AND" + "MeterSrMo = " + "MeterSrMo";

        Log.e("where ", "-->>" + whereClause);
        //to get count if it is more than zero than update else insert to table
        String query = "SELECT count( * ) as count from myTable where " + whereClause;

        //check count if that value exists in db
        if (query.trim().length() <= 0) {
            db.insert(myTable, intCode, cv); //intCode is primary key
        } else {
            db.update(myTable, cv, whereClause, null);
        }
        db.close();

【讨论】:

  • 查看我更新的答案@Moin Khan 希望能解决您的问题。
  • 我的朋友这段代码怎么样?@Jitendraramoliya@?Moin Khan
【解决方案3】:

ConAcNo 设置为表的主键,并使用 SQLiteDatabase 类的 insert(...) 方法。请记住,它不会抛出任何错误并在出现任何错误时返回-1。如果您尝试插入重复记录,则会导致错误并返回-1,您可以忽略。

Documentation of insert() method

Guide for Saving Data in SQL Databases

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2012-03-28
    • 2018-04-02
    相关资源
    最近更新 更多