llf2580 2023-03-14 15:32 采纳率: 66.7%
浏览 29
已结题

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();

  • 写回答

3条回答 默认 最新

  • 憧憬blog 2023-03-14 15:55
    关注

    根据您提供的代码和截图,可以看出修改数据库和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点建议修改代码。当然,如果还有其他问题,请您提供错误信息(如程序崩溃信息)以及更多的代码细节。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 修改了问题 3月14日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助