【问题标题】:Getting Null SQLite database values获取 Null SQLite 数据库值
【发布时间】:2013-06-28 17:02:44
【问题描述】:

我正在实现一个 SQLite 数据库,但我无法弄清楚为什么某些列值为空。这是我写给我的 SQLiteDatabase(db) 的地方。 ArrayList 肯定有车辆列表,每辆车肯定有正确的值(车辆 ID、地址、城市、州......)。数据库内部的表也有我构建的列(我也检查过)。

由于某种原因,当我进行诸如 cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_CITY)) 之类的调用时,它会变为 null,但是当我对 KEY_LAT 进行相同的调用时,它可以工作。 (车辆 ID、经纬度有效,但其他无效)..

public static void addVehicle(ArrayList<Vehicle> aList) {

        Database.openWritable();
        ContentValues values = new ContentValues();
        for(Vehicle vehicle : aList){

        values.put(KEY_VEHICLE_ID, vehicle.getvehicleID());  
        values.put(KEY_ADDRESS, vehicle.getaddress());
        values.put(KEY_CITY, vehicle.getcity());
        values.put(KEY_STATE, vehicle.getstate());

        values.put(KEY_LAT, vehicle.getLat());
    values.put(KEY_LON, vehicle.getLon());

        db.insert(TABLE_VEHICLE, null, values);
           }
    }

其他信息/问题这个循环发生了数百次,我觉得它应该只发生在我拥有的行数中,即 14 行(我在数据库中有 14 辆车)。这可能会影响什么?但我怀疑不是。那么为什么会这样呢? :

    String query = "SELECT * FROM " + DatabaseHandler.TABLE_VEHICLE;
    Cursor cursor = Database.listOfVehiclesDesired(query);

    String lat = "";
    String lon = "";
    String title = "";
    String snippet = "";


    if(cursor.moveToFirst()){
        do {

            lat = (cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_LAT)));
            lon = (cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_LON)));
            title = cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_VEHICLE_ID)) + " " +  cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_VEHICLE_NAME));
            snippet = "City:" + cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_CITY)) + ", State: " + cursor.getString(cursor.getColumnIndex(DatabaseHandler.KEY_STATE));
            addMarkers(new LatLng(lat, lon), true, R.drawable.cap, title, snippet);
        } while (cursor.moveToNext());
    }
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }

多余的(?)背景信息:我正在使用静态类来访问 SQLiteDatabase,此外,获取列索引等的代码也在 AsyncTask 中。

【问题讨论】:

  • 创建表时可以为表的每一列设置列约束not nulladdVehicle() 将在应插入空值时失败。所以你可以检查这是不是问题
  • 这是正确的说法吗? "CREATE TABLE " + TABLE_VEHICLE + " (" + KEY_VEHICLE_ID + " TEXT NOT NULL, " +...重复。我不相信它失败了
  • 你能想出为什么某些值为空的原因吗?我 100% 确定我输入的信息具有价值!某个地方的价值观一定会丢失还是什么?
  • 有很多可能性。您应该使用调试器来准确观察正在发生的事情。如果这没有帮助,请显示调用 addVehicle() 的代码

标签: android sqlite


【解决方案1】:

如果光标关闭,你如何关闭光标?!! 你编码:

   if (cursor != null && !cursor.isClosed()) {
    cursor.close();

只用 cursor.close() 试试代码;

【讨论】:

  • 我认为代码是说如果它没有关闭,那么它应该关闭。我按照你说的方法试了一下,没有解决问题:(
  • 也许你应该添加返回; cursor.close() 之后的方法;返回一些东西
  • 它在一个 void 方法中。我相信这个问题更高了
  • 是的,但最后,根据你对错误的描述,我认为“sn-p =”是原因尝试编辑它或以你知道的不同方式进行。
  • 这段代码 sn-p 完全没问题(除了 cursor != null 检查在原始代码的上下文中不是必需的,但它也没有害处)
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多