【问题标题】:Unable to retrieve data from SQLite table无法从 SQLite 表中检索数据
【发布时间】:2015-01-11 15:23:38
【问题描述】:

我正在向 sqlite 表添加数据,如下所示:

public void addAuthDetails(String authCode, int sessionId, int paramsCrC, int returnStock, int firstTime){
        SQLiteDatabase db = getWritableDatabase();
        ContentValues authValue = new ContentValues();

        authValue.put(AUTH_CODE, authCode);
        authValue.put(SESSION_ID, sessionId);
        authValue.put(PARAM_CRC, paramsCrC);
        authValue.put(RETURN_STOCK, returnStock);
        authValue.put(FIRST_TIME_RUN, firstTime);

        db.insert(TABLE_AUTH, null, authValue);
    }

这个数据库中只有一行,但是,当我尝试查询会话 id 时它返回零,并且我已经调试并且会话 id 的值不为零。

这是我如何查询以获取会话 ID。

 public int getSessionId(){
    int sessionId = 0;
    String sessionIdQuery = "SELECT * FROM " + TABLE_AUTH;

    SQLiteDatabase db = getReadableDatabase();

    Cursor cursor = db.rawQuery(sessionIdQuery, null);

    if(cursor.moveToFirst()){
        sessionId = cursor.getInt(cursor.getColumnIndex(SESSION_ID));
    }
    return sessionId;
}

我不确定为什么我的值为零?谁能帮我解决这个问题,我将不胜感激。

编辑一些 DBManager 代码

 public DBManager(Context ctx) {
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_USER_TABLE);
    db.execSQL(CREATE_AUTH_TABLE);
    db.execSQL(CREATE_PARAMS_TABLE);
    db.execSQL(CREATE_PRODUCTS_TABLE);
    db.execSQL(CREATE_VENDORS_TABLE);
    db.execSQL(CREATE_STOCK_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_STOCK);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_VENDORS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUCTS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_PARAMS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_AUTH);

    onCreate(db);
}


   //TABLE_AUTH Create Statement
    public static final String CREATE_AUTH_TABLE = "CREATE TABLE "
            + TABLE_AUTH + "("
            + AUTH_CODE + " TEXT, "
            + SESSION_ID + " TEXT, "
            + AUTH_TIME + " INTEGER, "
            + TOKEN + " TEXT, "
            + PARAM_CRC + " INTEGER, "
            + FIRST_TIME_RUN + "INTEGER, "
            + RETURN_STOCK + "INTEGER, "
            + ENCRYPT_KEY
            + " TEXT" + ")";

【问题讨论】:

  • 查询工作正常并且您的数据库中存在记录?
  • 最好先测试一下你的数据库有没有值。你可以使用为eclipse添加SQLiteManager插件来测试它。
  • 是的,当我进入 getSessionId() 方法时,游标的大小为 1,(它应该)并且它进入并点击行 sessionId = cursor.getInt...。但它仍然返回为零,我已经在方法的第一行初始化了它!这很令人困惑,因为我遵循的所有 tuts,这就是它的完成方式
  • @andrewww 我正在与 Android studio 合作,我会看看是否有类似的东西
  • 检查光标是否移动到第一个。

标签: android sqlite


【解决方案1】:

好的,对于在这个问题上浪费的任何时间,我深表歉意。

我已经设法解决了这个问题。

好的,我已经设法修复它...上述错误的原因是我缺少一个空格

+ FIRST_TIME_RUN + "INTEGER, "

+ RETURN_STOCK + "INTEGER, ""INTEGER 之间。所以表是在没有这些列的情况下创建的,然后当我尝试将数据插入所有列并且它们不存在时,我假设没有数据写入数据库,所以当我尝试提取数据时它不是那里...我不知道创建表格时的间距是如此重要!重要的教训!感谢大家的帮助

【讨论】:

    【解决方案2】:

    我不知道这是否是创建数据库失败的问题,但 OnUpgrade 方法会在您每次调用它时删除数据库。看看这个讨论Confusion: How does SQLiteOpenHelper onUpgrade() behave? And together with import of an old database backup?

    您正在删除数据并从头开始创建数据库。

    我建议您在已有的所有 onupgrade 行后面包含一个“if”语句:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    if (newVersion > oldVersion) {
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_STOCK);
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_VENDORS);
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUCTS);
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_PARAMS);
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_AUTH);
    
       onCreate(db);
     }
    

    }

    我介绍的仍然是危险的,每次你有一个新版本的数据库时,它都会杀死表,删除数据并创建一个新的。除非您的应用需要在每次升级时删除所有数据。

    我建议包含数据库的副本,以便以后将数据转移到新的。

    【讨论】:

    • 嗨,在我的日志猫中,我注意到当我尝试将数据输入到身份验证表中时,我得到了这个:插入 ParamsCRC=1 SessionId=77615 AuthCode=56766340 FirstTime=0 ReturnStock=0 android 时出错.database.sqlite.SQLiteException: table auth has no column named FirstTime (code 1): ,同时编译: INSERT INTO auth(ParamsCRC,SessionId,AuthCode,FirstTime,ReturnStock) VALUES (?,?,?,?,?)'即使在我的表中创建了列创建字符串,有什么想法吗?这可能会导致问题
    • 嗯...你能包括完整的代码吗?特别是我现在需要字符串:FIRST_TIME_RUN、TABLE_AUTH 和 CREATE_AUTH_TABLE
    • TABLE_AUTH 的值是“auth”,FIRST_TIME_RUN 的值是“FirstTime”吗??
    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 2019-07-03
    • 1970-01-01
    • 2021-05-25
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多