Курсор всегда равен нулю, даже если многие записи вставлены успешно

Я пишу простую грубую операцию с использованием базы данных 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();
        }
    });
}
0
0
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Надеюсь, у вас есть класс 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();
        }
    });

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

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

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

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

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

Ответ принят как подходящий
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);

            }

привет! Я сделал еще один пост на stackoverflow. это ссылка: stackoverflow.com/questions/50333701/… Пожалуйста, прочтите ее и направьте меня, если сможете, я буду вам благодарен

Saboor Siddique 16.05.2018 14:14

Другие вопросы по теме