【问题标题】:Unable to update or select value from SQLite in android Application无法从 Android 应用程序中的 SQLite 更新或选择值
【发布时间】:2019-01-30 23:11:05
【问题描述】:

我正在开发 android 应用程序,我正在使用 Sqlite db,我创建了一堆方法来添加表和插入,除了 2 个方法之外,它们都可以正常工作

第一个是将字段的值更新为1的方法

public void UnlockNextLevel(String lvlname ,int num){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(SchemClass.LetsCode2.COLUMN_NAME_LEVELSTATUS,num);
    db.update(SchemClass.LetsCode2.SECOND_TABLE ,cv, SchemClass.LetsCode2.COLUMN_NAME_LevelName +" = "+lvlname,null );
}

当我运行它时,它会导致运行时异常

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.a96653.LetsCode, PID: 3392
    android.database.sqlite.SQLiteException: no such column: Ploto (code 1 SQLITE_ERROR): , while compiling: UPDATE LEVEL SET LevelStatus=? WHERE LevelName =  Ploto

另一种方法是从数据库中选择方法:

public int returnQuestionAnswer (int Qnum){

    SQLiteDatabase db = this.getWritableDatabase();
   int lnum=100;
   String query = "SELECT "+SchemClass.LetsCode2.COLUMN_NAME_QANSWER +" FROM "+SchemClass.LetsCode2.TABLE_AUESTION +" WHERE "+SchemClass.LetsCode2.COLUMN_NAME_QNUM +" = "+Qnum;
   Cursor recordSet=db.rawQuery(query,null);
    recordSet.moveToFirst();

    while (!recordSet.isAfterLast()){
        lnum=recordSet.getInt(recordSet.getColumnIndex(SchemClass.LetsCode2.COLUMN_NAME_QANSWER));
    }
    db.close();

   return lnum;
}

当我想在 textView 中显示整数值时会导致运行时异常

我无法发布的最后一个例外,所以我会在这里发布:

java.lang.NullPointerException: Attempt to invoke virtual method
'java.io.File android.content.Context.getDatabasePath(java.lang.String)' 
on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)

【问题讨论】:

  • 最后一个异常我无法发布所以我会在这里发布 java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath (java.lang.String)' 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843) 处的空对象引用上

标签: android sqlite exception


【解决方案1】:

问题 1

更新失败,因为要比较的值用引号括起来,因此被视为标识符(在这种情况下为列名),而不是文字值。要解决此问题:-

db.update(SchemClass.LetsCode2.SECOND_TABLE ,cv, SchemClass.LetsCode2.COLUMN_NAME_LevelName +" = '"+lvlname + "'",null );

或者最好还是使用:-

db.update(SchemClass.LetsCode2.SECOND_TABLE ,cv, SchemClass.LetsCode2.COLUMN_NAME_LevelName +"=?",new String[]{lvlname} );
  • ? 占位符与参数结合使用被认为更好,因为它可以防止 SQL 注入并自动包含值,确保将其视为文字而不是标识符。

问题 2

没有足够的信息来确定第二个问题,但很可能上下文为空,这是因为您有类似的东西

your_DBHelper = new DatabaseHelper(this);

在活动的类定义中,当您应该声明 DatabaseHelper 对象,然后在 onCreate 方法中实例化它时

例如像

public class YourActivity extends AppCompatActivity {

    DatabaseHelper myDBHlpr;
    //DatabaseHelper myDBHlpr = new DatabaseHelper(this); <<<<<<<<<< NULL POINTER EXCEPTION

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDBHlpr = new DatabaseHelper(this); //<<<<<<<<< instantiates the DatabaseHelper Object
    }
}
  • 注意对象/活动的名称必须根据您的代码进行更改。
  • 您可能没有 AppCompActivity,这已用于演示,但原理相同。

【讨论】:

  • 我做了这些更改,并没有导致运行时异常,但更新方法没有反映在数据库中
  • 检查 update 方法返回的值,如果它是 1 或更多,则正在更新行,如果不是,则没有具有值 Ploto 的行 假设这是 lvlname 解析为的值。
  • @AlbtoulAlmuhanna 很好,如果您认为答案帮助您解决了问题,您能否勾选答案。
猜你喜欢
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多