Android Studio修改数据库和SharedPreferences的数据

请问下面修改数据库和SharedPreferences数据的代码哪里有问题,一运行到这里app就关闭。
布局是有三个EditText,一个按钮。
点击按钮后将数据库和SharedPreferences的账号、昵称、密码修改成EditText里的数据。
希望有人指导一下,感谢

// DBHelper里有用户数据表table_Accounts,存放了_id,账号,昵称,密码
// 还有另一个表table_AccountFigure,也涉及账号
DBHelper dbHelper = new DBHelper(this);
// SharedPreferences存放了当前登录的账号,昵称,密码
SharedPreferences sp = getSharedPreferences("LoginSp", Context.MODE_PRIVATE);
String Acc = sp.getString("account",null);//存储当前账号
if(v.getId() == R.id.mi_buttonConfirm) {//点击按钮事件响应
    // 获取EditText里的账号、昵称、密码
    String acc = mi_acc.getText().toString();
    String na = mi_na.getText().toString();
    String pwd = mi_pwd.getText().toString();
    // 检查修改后的账号是否已存在
    SQLiteDatabase dbread = dbHelper.getReadableDatabase();
    String sql = "select * from "+DBHelper.table_Accounts+" where account="+acc;
    Cursor cursor = dbread.rawQuery(sql,null);
    int flag = cursor.getCount();
    dbread.close();
    if(!Acc.equals(acc) && flag != 0) {// 该账号已存在
        Toast.makeText(getBaseContext(),"该账号已存在,请重新修改",Toast.LENGTH_SHORT).show();
    }
    else {
        // 修改数据库
        SQLiteDatabase dbwrite = dbHelper.getWritableDatabase();
        String sql1 = "update "+DBHelper.table_Accounts+" set account="+acc+",name="+na+",password="+pwd+" where account="+Acc;
        dbwrite.execSQL(sql1);
        String sql2 = "update "+DBHelper.table_AccountFigure+" set account="+acc+" where account="+Acc;
        dbwrite.execSQL(sql2);
        dbwrite.close();
        // 修改LoginSp
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("account",acc);editor.putString("name",na);
        editor.putString("password",pwd);
        editor.commit();
        // 跳转其他Activity
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

img


第85行代码是:dbwrite.close();

根据您提供的代码和截图,可以看出修改数据库和SharedPreferences的数据的代码有以下问题:

1.第20行的字符串拼接语句中,应该在将变量acc、na、pwd插入到SQL语句的字符串中时,需要加上单引号,以避免因为没有引号导致语法错误。正确的方式是:

String sql1 = "update "+DBHelper.table_Accounts+" set account='"+acc+"',name='"+na+"',password='"+pwd+"' where account='"+Acc+"'";

2.第24行获取Cursor对象后,需要遍历Cursor结果集之前,应该先判断Cursor是否为空,否则如果Cursor结果集为空会导致程序崩溃。正确的方式是:

if(cursor != null && cursor.getCount() > 0){
    //遍历Cursor结果集
}

3.第85行数据库的写锁已经释放了,如果再调用dbwrite.close()方法会导致程序崩溃,应该删除该行代码,正确的方式是:

SQLiteDatabase dbwrite = dbHelper.getWritableDatabase();
String sql1 = "update "+DBHelper.table_Accounts+" set account='"+acc+"',name='"+na+"',password='"+pwd+"' where account='"+Acc+"'";
dbwrite.execSQL(sql1);
String sql2 = "update "+DBHelper.table_AccountFigure+" set account='"+acc+"' where account='"+Acc+"'";
dbwrite.execSQL(sql2);
//dbwrite.close() 这行代码应该删除

综上所述,可以参考以上3点建议修改代码。当然,如果还有其他问题,请您提供错误信息(如程序崩溃信息)以及更多的代码细节。

具体的代码可以写在 activity 里