курсор всегда нулевой, даже если многие записи вставлены успешно - PullRequest
0 голосов
/ 12 мая 2018

Я пишу простую операцию crud с использованием базы данных sqlite . Когда я нажимаю кнопку вставки, данные вставляются успешно. Но когда я нажимаю кнопку поиска, курсор всегда отображается пустым, а счетчик курсоров всегда равен 0. Я даю свой код. Пожалуйста, смотрите код под btnSearch.setOnclickListener и btnInsert.setOnclickListener

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_db2);
    btnInsert = (Button) findViewById(R.id.btnInsert);
    btnSearch = (Button) findViewById(R.id.btnSearch);
    btnDelete = (Button) findViewById(R.id.btnDelete);
    btnUpdate = (Button) findViewById(R.id.btnUpdate);

    edname = findViewById(R.id.editText1);
    edphone = findViewById(R.id.editText2);
    edaddress = findViewById(R.id.editText3);

    db = openOrCreateDatabase("MyDB", MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS Info(Name Varchar, phone Varchar, address Varchar)");


    btnSearch.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           Cursor cursor=null;
            try {if(cursor.moveToNext()) {

                    Toast.makeText(DB.this, "button pressed", Toast.LENGTH_SHORT).show();
                    int count = cursor.getCount();
                    Toast.makeText(DB.this, String.valueOf(count), Toast.LENGTH_SHORT).show();
                    Toast.makeText(DB.this, cursor.getString(cursor.getColumnIndex("Name")), Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(DB.this, "cursor is null", Toast.LENGTH_LONG).show();
                }

            }
            catch (Exception ex){
                Toast.makeText(DB.this, "ERROR: "+ ex.toString(), Toast.LENGTH_LONG).show();
            }
           }
    });

    btnInsert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = edname.getText().toString();
            String phn = edphone.getText().toString();
            String addr = edaddress.getText().toString();
            String query = "INSERT INTO Info (Name,phone,address)VALUES("+name+","+phn+","+addr+")";
            Toast.makeText(DB.this, "data inserted", Toast.LENGTH_SHORT).show();
        }
    });
}

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Хорошо, прежде всего, вам нужно применить некоторые общие принципы объектно-ориентированного программирования, такие как Принцип единой ответственности .

Вам необходимо изолировать базу данных , чтобы ничего не знать о бизнес-правилах вашего приложения. Это хорошая отправная точка .

О вашей проблеме:

  • Вы неправильно внедрили SQLite. SQLite необходимо расширить вспомогательный класс для создания, обновления и удаления БД при необходимости. Посмотрите эту статью , чтобы начать работу.

Дополнительно: btnInsert = (Button) findViewById(R.id.btnInsert); В Android Studio 3 + больше не требуется кастинг, поэтому удалите каст, чтобы сделать его намного проще = btnInsert = findViewById(R.id.btnInsert);

0 голосов
/ 12 мая 2018
Try This: To insert data into Info Table      

  btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = edname.getText().toString();
                String phn = edphone.getText().toString();
                String addr = edaddress.getText().toString();
                insertData(name,addr,phn);

            }
        }); 


    public void insertData(String name, String address, String phoneNumber) {
                SQLiteDatabase database = dbHelper.getWritableDatabase();

                    ContentValues contentValues = new ContentValues();
                    contentValues.put("Name", name);
                    contentValues.put("phone", address);
                    contentValues.put("address", phoneNumber);
                    database.insert("Info", null, contentValues);

            }
0 голосов
/ 12 мая 2018

Надеюсь, у вас есть класс Database, который расширяет SQLiteOpenHelper, и, пожалуйста, напишите все ваши запросы для создания в нем таблицы.

Теперь вы инициализируете cursor как cursor = null, это всегда будет возвращать null значений.

Попробуйте использовать

Cursor lCursor = null;

try {
    SQLiteDatabase lDataBase = this.getReadableDatabase();
    lCursor = lDataBase.rawQuery(pQuery, null);  // pQuery = you query for search

    if (lCursor != null && lCursor.getCount() > 0) {
        Toast.makeText(DB.this, "button pressed", Toast.LENGTH_SHORT).show();
        int count = cursor.getCount();
        Toast.makeText(DB.this, String.valueOf(count), Toast.LENGTH_SHORT).show();
        Toast.makeText(DB.this, cursor.getString(cursor.getColumnIndex("Name")), Toast.LENGTH_SHORT).show();
    }
    else {
        Toast.makeText(DB.this, "cursor is null", Toast.LENGTH_LONG).show();
    }
} catch (Exception ex) {
    // Do something when exception occurs
}

Еще одна вещь: ваши данные не хранятся в базе данных. Потому что вы не выполняете свой запрос. Используйте это

btnInsert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = edname.getText().toString();
            String phn = edphone.getText().toString();
            String addr = edaddress.getText().toString();
            String query = "INSERT INTO Info (Name,phone,address)VALUES("+name+","+phn+","+addr+")";
            db.execSQL(query);
            Toast.makeText(DB.this, "data inserted", Toast.LENGTH_SHORT).show();
        }
    });
...