请问下面修改数据库和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);
}
根据您提供的代码和截图,可以看出修改数据库和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 里