【问题标题】:Random Android Sqlite Crashes [duplicate]随机Android Sqlite崩溃[重复]
【发布时间】:2016-04-13 05:02:28
【问题描述】:

我不确定为什么会收到此错误:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

我正在为 sqlite 中的这些行获取它:

db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE)));
db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE)));

如果我将它们注释掉,它就可以工作,这就是整个 sqlite 方法:

public List<DatabaseUser> getUsers(int type) {

        String whereClause = KEY_IS_FOLLOWING_TYPE + " = ? ";
        if(type == 1) {

            whereClause = KEY_IS_FOLLOWER_TYPE + " = ? ";
        }
        List<DatabaseUser> getUsers = new ArrayList<DatabaseUser>();
        SQLiteDatabase db = this.getReadableDatabase();
        String[] whereArgs = new String[]{
                "1"
        };
        String orderBy = KEY_ID + " DESC";

        Cursor c = db.query(TABLE_USERS, null, whereClause, whereArgs, null, null, orderBy);

        if (c.moveToFirst()) {
            do {
                DatabaseUser db_d = new DatabaseUser();

                db_d.setUserId(c.getString(c.getColumnIndex(KEY_USER_ID)));
                db_d.setPicture(c.getString(c.getColumnIndex(KEY_PICTURE)));
                db_d.setUsername(c.getString(c.getColumnIndex(KEY_USERNAME)));

                db_d.setFollowersCount(c.getInt(c.getColumnIndex(KEY_FOLLOWERS_COUNT)));
                db_d.setFollowingCount(c.getInt(c.getColumnIndex(KEY_FOLLOWING_COUNT)));
                db_d.setTrackingCount(c.getInt(c.getColumnIndex(KEY_TRACKING_COUNT)));
                db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE)));
                db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE)));
                db_d.setIsChanged(c.getInt(c.getColumnIndex(KEY_IS_CHANGED)));

                db_d.setDateAdded(c.getLong(c.getColumnIndex(KEY_DATE_ADDED)));

                Log.d(Constants.DEBUG, "DB pull user product " + db_d);
                getUsers.add(db_d);
            } while (c.moveToNext());
        }

        //calling for close for recycling make sure it does not cause an error
        c.close();
        return getUsers;

    }

这是我的表创建方法:

private static final String CREATE_TABLE_USERS = "CREATE TABLE "
            + TABLE_USERS + "("
            + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + KEY_USER_ID + " TEXT NOT NULL UNIQUE ON CONFLICT REPLACE,"
            + KEY_PICTURE + " TEXT,"
            + KEY_USERNAME + " TEXT,"
            + KEY_FOLLOWERS_COUNT + " INTEGER,"
            + KEY_FOLLOWING_COUNT + " INTEGER,"
            + KEY_TRACKING_COUNT + " INTEGER,"
            + KEY_IS_FOLLOWING_TYPE + " INTEGER,"
            + KEY_IS_FOLLOWER_TYPE + " INTEGER,"
            + KEY_IS_CHANGED + " INTEGER,"
            + KEY_DATE_ADDED + " LONG"
            + ")";

这是 DatabaseUser 对象:

public class DatabaseUser {



    private String userId, picture, username;
    private int followersCount, followingCount, trackCount, isChanged, isFollowingType, isFollowerType; 
    private long dateAdded;


    //TODO USER NO NEED FOR ISFOLLOWING
    public DatabaseUser() {
    }


    //TODO TESTING
    public DatabaseUser(String uId, String pic, String uname,
                        int followersC, int followingC, int trackC, int isChng, int followingtype, int followertype,
                        long dateAdd) {
        userId = uId;
        picture = pic;
        username = uname;
        followersCount = followersC;
        followingCount = followingC;
        trackCount = trackC;
        isChanged = isChng;
        isFollowingType = followingtype;
        isFollowerType = followertype;
        dateAdded = dateAdd;


    }


    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getFollowersCount() {
        return followersCount;
    }

    public void setFollowersCount(int followersCount) {
        this.followersCount = followersCount;
    }

    public int getFollowingCount() {
        return followingCount;
    }

    public void setFollowingCount(int followingCount) {
        this.followingCount = followingCount;
    }

    public int getTrackingCount() {
        return trackCount;
    }

    public void setTrackingCount(int trackCount) {
        this.trackCount = trackCount;
    }

    public int getIsChanged() {
        return isChanged;
    }

    public void setIsChanged(int isChanged) {
        this.isChanged = isChanged;
    }

    public int getIsFollowingType() {
        return isFollowingType;
    }

    public void setIsFollowingType(int isFollowingType) {
        this.isFollowingType = isFollowingType;
    }

    public long getDateAdded() {
        return dateAdded;
    }

    public void setDateAdded(long dateAdded) {
        this.dateAdded = dateAdded;
    }

    public int getIsFollowerType() {
        return isFollowerType;
    }

    public void setIsFollowerType(int isFollowerType) {
        this.isFollowerType = isFollowerType;
    }
}

这是我在发生错误的 MainHome Activity 中进行检查的地方:

 private void testCreateUserFollowing() {


        //0 is for isType following
        DatabaseUser testUserFollowing1 = new DatabaseUser("userId1", "pictureId", "username1", 2354, 30534, 498231, 0, 1, 3, 0);
        DatabaseUser testUserFollowing2 = new DatabaseUser("userId2", "pictureId", "username2", 2750000, 30000000, 4, 0, 1, 3, 0);
        DatabaseUser testUserFollowing3 = new DatabaseUser("userId3", "pictureId", "username3", 2, 3, 4, 0, 1, 3, 0);



        DatabaseUser testUserFollower1 = new DatabaseUser("userId4", "pictureId", "username4", 2, 3, 4, 0, 3, 1, 0);
        DatabaseUser testUserFollower2 = new DatabaseUser("userId5", "pictureId", "username5", 2, 3, 4, 0, 3, 1, 0);
        DatabaseUser testUserFollower3 = new DatabaseUser("userId6", "pictureId", "username6", 2, 3, 4, 0, 3, 1, 0);

        DatabaseUser checkUsersExist = db.getSingleUser("userId3");
        if(checkUsersExist != null) {

        } else {
            db.createUser(testUserFollowing1);
            db.createUser(testUserFollowing2);
            db.createUser(testUserFollowing3);
            db.createUser(testUserFollower1);
            db.createUser(testUserFollower2);
            db.createUser(testUserFollower3);
        }


    }

注释掉 tee 上面提到的两个字段是可行的,但是我需要它来取消注释它...另外,我意识到其他 sqlite 错误弹出另一个行,另一个表出现相同的错误...如果这对任何事情都有帮助。我在包含 sqlite 方法的 SQLITE Helper 类上没有错误...所以不确定为什么会弹出此错误...

更新:对于任何感兴趣的人: 显然调用 deleteDatabase("dbname");只能工作,卸载或清除应用数据没有...

【问题讨论】:

  • 您最近是否将该列添加到您的 CREATE TABLE 并且没有升级/擦除现有数据库文件?
  • 是的,因为我重新安装了应用程序以清除旧数据库,这是在清除数据库后开始弹出此错误的时间。否则在此之前它工作正常所以不确定,因为已添加 MainHome 类检查存在方法中的测试创建,并且我清除了它开始发生的数据库。
  • 添加你的 createUser 方法代码
  • 您必须卸载该应用程序并重新安装。由于您处于开发阶段,因此卸载就足够了。如果您要进行版本更改,那么您必须升级您的数据库。

标签: java android sqlite


【解决方案1】:

首先你需要检查游标是否为空,然后在从中获取数据后,如下所示

if(c!=null){
 if (c.moveToFirst()) {
            do {
                DatabaseUser db_d = new DatabaseUser();

                db_d.setUserId(c.getString(c.getColumnIndex(KEY_USER_ID)));
                db_d.setPicture(c.getString(c.getColumnIndex(KEY_PICTURE)));
                db_d.setUsername(c.getString(c.getColumnIndex(KEY_USERNAME)));

                db_d.setFollowersCount(c.getInt(c.getColumnIndex(KEY_FOLLOWERS_COUNT)));
                db_d.setFollowingCount(c.getInt(c.getColumnIndex(KEY_FOLLOWING_COUNT)));
                db_d.setTrackingCount(c.getInt(c.getColumnIndex(KEY_TRACKING_COUNT)));
                db_d.setIsFollowingType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWING_TYPE)));
                db_d.setIsFollowerType(c.getInt(c.getColumnIndex(KEY_IS_FOLLOWER_TYPE)));
                db_d.setIsChanged(c.getInt(c.getColumnIndex(KEY_IS_CHANGED)));

                db_d.setDateAdded(c.getLong(c.getColumnIndex(KEY_DATE_ADDED)));

                Log.d(Constants.DEBUG, "DB pull user product " + db_d);
                getUsers.add(db_d);
            } while (c.moveToNext());
        }
}

【讨论】:

  • 我试过这个方法它不起作用,c 不为空它是那些给我错误的列的记录不存在
  • 好的,那么请确认您用于获取数据的列的所有键与返回的列名相同。
猜你喜欢
  • 2013-04-21
  • 2022-01-14
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2012-10-24
  • 2023-03-20
相关资源
最近更新 更多