批量插入不插入

Posted

技术标签:

【中文标题】批量插入不插入【英文标题】:Batch Insert not Inserting 【发布时间】:2018-01-05 08:21:02 【问题描述】:

我一直在尝试将“一批”数据插入 android 应用程序的 SQLITE 数据库中。我没有收到任何错误,但是稍后尝试从该表中进行选择时,没有返回任何数据。

该应用程序同时使用 SQL Server 和 SQLITE,因为设备不会始终连接到网络,因此无法始终访问 SQLServer,因此我正在运行查询以从 SQLServer 中进行选择,然后将该结果集传递给方法旨在将数据推送到 SQLITE DB

我所遵循的流程如下:

    删除当前在 sqliteDB 中的所有内容

     mDb = mDbHelper.getReadableDatabase();    
     mDb.execSQL("delete from TABLE_1"); 
    

    从 SQLserver 获取数据

    Connection con = connectionClass.CONN();
    connect = con;
    
    
    try 
    
        PreparedStatement statement = connect.prepareStatement("Exec SelectAll '" + Param1+ "'");
        rs = statement.executeQuery();
    
        liteAdapter.insertIntoDbLite(rs);
    
        con.close();
     catch (SQLException ex) 
    
        String error = ex.getMessage();
    
    
    

    将第 2 步的结果集传递给应该将数据批量插入到 sqlite 的方法

    //Insert Records into Bale Table from SQL Server
    public void insertIntoDbLite(ResultSet rs)
     
      mDb = mDbHelper.getWritableDatabase();
      mDb.beginTransaction();
      try 
    
        ContentValues values = new ContentValues();
        try 
            while (rs.next()) 
    
                //put value(Column_Name, record)
                values.put("COL1", rs.getString("Col1_Val"));
                values.put("COL2", rs.getString("Col2_Val"));
                values.put("COL3", rs.getString("Col3_Val"));
                values.put("COL4", rs.getString("Col4_Val"));
                values.put("COL5", rs.getString("Col5_Val"));
                values.put("COL6", rs.getString("Col6_Val"));
                values.put("COL7", rs.getString("Col7_Val"));
                values.put("COL8", rs.getString("Col8_Val"));
                values.put("COl9", rs.getString("Col9_Val"));
    
            
            mDb.insert("TABLE_1", null, values);
        
        catch (java.sql.SQLException e)
        
            Log.e("Error in SQL",e.toString());
        
    
        mDb.setTransactionSuccessful();
    
    
    catch(Exception ex)
    
        Log.e("Error in transaction",ex.toString());
    
    finally
    
        //End the transaction
        mDb.endTransaction();
    
    
     
    

所以一切似乎都运行良好,但是当我稍后查询数据库并进行选择时,该表没有返回任何值, 我错过了什么或只是做错了吗? 谢谢

【问题讨论】:

getReadableDatabase = 想知道readable 是什么意思?这是否意味着您可以删除? String error = ex.getMessage(); 实际打印这个错误怎么样? 首先打印错误信息 mDb.insert("TABLE_1", null, values); 更改为Log.d("INSERT","Return from insert is " + Long.toString(mDb.insert("TABLE_1", null, values)));。如果 log 中的值为 -1,则未插入行,如果为正,则这是插入行的 rowid,表明插入有效。如果 Log 中没有任何内容,则进入 while 循环。 @ScaryWombat getReadable 将按照创建和/或打开数据库的方式获取可写数据库。这将与 getWritableDatabase() 返回的对象相同,除非某些问题(例如磁盘已满)需要以只读方式打开数据库。在这种情况下,将返回一个只读数据库对象。 getReadableDatabase 【参考方案1】:

给定的代码似乎没有什么明显的错误。可能的情况是由于约束(例如但不限于 NOT NULL、UNIQUE 等规则),更新未执行更新。另一个可能不太可能的情况是没有进入 while 循环。

你可以通过改变来区分

mDb.insert("TABLE_1", null, values);

Log.d("INSERT","Return from insert is " + Long.toString(mDb.insert("TABLE_1", null, values)));

然后这将使用 :-

写入输出 (a) 没有输出到日志表明没有进入 while 循环,因此 rs 为空。 (b) -1 是唯一返回的值,表示由于限制而未完成更新。 (c) 返回全部或部分正 (> 0) 值,这表明正在执行更新,并且问题可能与稍后用于检查数据的方法有关。

如果 (b) 则将 mDb.insert 更改为 mDb.insertOrThrow 应该会导致第一个异常被捕获,这应该表明问题。

【讨论】:

以上是关于批量插入不插入的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:Elasticsearch批量插入时,存在就不插入

MySQL 批量插入,如何不插入重复数据?

mysql批量插入时,如何不插入重复数据

Elasticsearch批量插入时,存在就不插入

C#中的SQL批量插入不插入值

Oracle:使用 select 插入不返回批量收集新插入的 id