Невозможно обновить или выбрать значение из SQLite в приложении для Android - PullRequest
0 голосов
/ 31 января 2019

Я работаю над приложением для Android и использую Sqlite db, и я создал несколько методов для добавления таблиц и вставки, и все они работают правильно, кроме двух методов

первый - это методы обновлениязначение поля 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

Другой метод - метод выбора из db:

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)

1 Ответ

0 голосов
/ 31 января 2019

Выпуск 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, это использовалось для демонстрации, но применяется тот же принцип.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...