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

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

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

我所遵循的流程如下:

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

     mDb = mDbHelper.getReadableDatabase();    
     mDb.execSQL("delete from TABLE_1"); 
    
  2. 从 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();
    
    }
    
  3. 将第 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

标签: java android sqlite android-sqlite


【解决方案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 应该会导致第一个异常被捕获,这应该表明问题。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2020-02-02
    • 2020-10-24
    • 2015-03-31
    相关资源
    最近更新 更多