微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除SQLite数据库的顶层项目会导致应用崩溃

如何解决删除SQLite数据库的顶层项目会导致应用崩溃

我使用的是在网上找到的sqlite数据库类。当我删除最上面的项目并尝试重新加载数据库时,该应用程序崩溃,因为该数据库未重新分配ID。这意味着对于ID为1和2的两个项目,如果我删除第一项,则第二个项目维护ID2。因此,当光标尝试访问DB时,它将调用ID为1(不再存在)的项目和应用崩溃。我没有使用sqlite的经验。我认为问题出在删除一个项目后,数据库没有重新分配ID。

我正在使用的sqlite代码

public class DBHelper extends sqliteOpenHelper {

public static final String DATABASE_NAME = "UsersDB.db";
public static final String USER_TABLE_NAME = "Users";
public static final String USER_COLUMN_ID = "id";
public static final String USER_COLUMN_NAME = "name";
public static final String USER_COLUMN_SURNAME = "surname";
public static final String USER_COLUMN_JOB_TITLE = "job_title";
public static final String USER_COLUMN_LEVEL = "level";
public static final String USER_COLUMN_ROLE = "role";
public static final String USER_COLUMN_PHONE = "phone";
private HashMap hp;

public DBHelper(Context context) {
    super(context,DATABASE_NAME,null,1);
}

@Override
public void onCreate(sqliteDatabase db) {
    // Todo Auto-generated method stub
    db.execsql(
            "create table Users " +
                    "(id integer primary key,name text,surname  text,job_title  text,level  text,role  text,phone  text)"
    );
}

@Override
public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
    // Todo Auto-generated method stub
    db.execsql("DROP TABLE IF EXISTS Users");
    onCreate(db);
}

public boolean insertUSER (String name,String surname,String job_title,String level,String role,String phone) {
    sqliteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name",name);
    contentValues.put("surname",surname);
    contentValues.put("job_title",job_title);
    contentValues.put("level",level);
    contentValues.put("role",role);
    contentValues.put("phone",phone);
    db.insert("Users",contentValues);
    return true;
}

public Cursor getData(int id) {
    sqliteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select * from Users where id="+id+"",null );
    return res;
}

public int numberOfRows(){
    sqliteDatabase db = this.getReadableDatabase();
    int numRows = (int) DatabaseUtils.queryNumEntries(db,USER_TABLE_NAME);
    return numRows;
}

public boolean updateUSER (Integer id,String name,String phone)  {
    sqliteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name",phone);
    db.update("Users",contentValues,"id = ? ",new String[] { Integer.toString(id) } );
    return true;
}


public Integer deleteUSER (Integer id) {
    sqliteDatabase db = this.getWritableDatabase();
    return db.delete("Users","id=?",new String[] { String.valueOf(id) });
}

public ArrayList<String> getAllUsers() {
    ArrayList<String> array_list = new ArrayList<String>();

    sqliteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select * from Users",null );
    res.movetoFirst();

    while(!res.isAfterLast()){
        array_list.add(res.getString(res.getColumnIndex(USER_COLUMN_NAME)));
        res.movetoNext();
    }
    return array_list;
}
}

我正在使用此代码访问数据库

DBHelper userDB =new DBHelper(context);

    size=userDB.numberOfRows();
    Toast.makeText(context,String.valueOf(size),Toast.LENGTH_LONG).show();

    if(size>0){
        main_label.setVisibility(View.GONE);
        main_listView.setVisibility(View.VISIBLE);
        data=new String[size][2];
        ids=new int[size];
        for(int i=0;i<size;i++){
            Cursor cursor;
            cursor=userDB.getData(i+1);
            cursor.movetoFirst();
            data[i][0]=cursor.getString(cursor.getColumnIndex(DBHelper.USER_COLUMN_SURNAME));
            data[i][0]+=" "+cursor.getString(cursor.getColumnIndex(DBHelper.USER_COLUMN_NAME));
            data[i][0]+="\n"+cursor.getString(cursor.getColumnIndex(DBHelper.USER_COLUMN_JOB_TITLE));
            data[i][1]=cursor.getString(cursor.getColumnIndex(DBHelper.USER_COLUMN_PHONE));
            ids[i]=cursor.getInt(cursor.getColumnIndex((DBHelper.USER_COLUMN_ID)));
            if (!cursor.isClosed())  {
                cursor.close();
            }
        }
        customAdapter = new listadapterUsers(context,mActivity,data,ids,size);
        main_listView.setAdapter(customAdapter);
    }else {
        main_label.setVisibility(View.VISIBLE);
        main_listView.setVisibility(View.GONE);
    }

此行会导致崩溃

cursor=userDB.getData(i+1);

错误

Caused by: android.database.Cursorindexoutofboundsexception: Index 0 requested,with a size of 0

如果我将代码更改为cursor = userDB.getData(i + 2);那么它会正常工作,因为有一个ID为2的商品

数据库中是否缺少某些内容?我尝试使用db.exec(“ Vacuum”);删除后却无法正常工作。 任何帮助表示赞赏。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。