Нужно ли мне дополнительно писать запрос выбора при использовании значений содержимого?

#android #sqlite

#Android #sqlite

Вопрос:

Я работаю над фрагментом кода для выполнения операций CRUD в базе данных Sqlite в Android Studio. Я создал ListView для хранения двух атрибутов, то есть имени и задания, но приложение разбивается во время выполнения. В нем говорится:

Исключение Sqlite: такой столбец (код 1) «имя» не найден.

Я искал решение, но каждое проверенное мной решение является неудачным. Мой браузер БД показывает, что таблица содержит столбец. Нужно ли добавлять SELECT FROM …запрос к моему коду? Если да, то куда мне поместить код?

введите описание изображения здесь

мой код, как показано ниже:

DatabaseHelper.class

импортируйте android.content.ContentValues; импортировать android.content.Контекст; импорт android.database.Курсор; импорт android.database.sqlite.SQLiteDatabase; импорт android.database.sqlite.SQLiteOpenHelper;

общедоступный класс DatabaseHelper расширяет SQLiteOpenHelper {

 private static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "SQLiteDatabase.db";
public static final String TABLE_NAME = "USERS";
public static final String _ID = "_id";
public static final String DESC = "occupation";
public static final String SUBJECT = "name";
SQLiteDatabase myDb;

private static final String CREATE_TABLE = "CREATE TABLE "   TABLE_NAME  
        "("   _ID    " INTEGER  PRIMARY KEY AUTOINCREMENT,"
          SUBJECT   "TEXT NOT NULL,"
          DESC   "TEXT"  ")" ;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(" DROP TABLE IF EXISTS "   TABLE_NAME);
    onCreate(db);

}

public long insert(String name, String desc) {
     myDb = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(DatabaseHelper.SUBJECT, name);
    contentValues.put(DatabaseHelper.DESC, desc);
    long id = myDb.insert(DatabaseHelper.TABLE_NAME, null, contentValues);
    myDb.close();
    return id;
}

public Cursor read(){
    SQLiteDatabase myDb = this.getWritableDatabase();
    String[] columns = new String[] {DatabaseHelper._ID,DatabaseHelper.SUBJECT,DatabaseHelper.DESC};
    Cursor cursor = myDb.query(DatabaseHelper.TABLE_NAME,columns,null,null,null,null,null);
    if(cursor!=null){
        cursor.moveToFirst();
    }
    myDb.close();
 return cursor;
}

 }
  

MainActivity.class

импортируйте android.content.Намерение; импорт android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.view.View; импорт android.widget.AdapterView; импорт android.widget.ArrayAdapter; импорт android.widget.Кнопка; импортировать android.widget.ListView;

импортируйте java.util.ArrayList;

открытый класс MainActivity расширяет AppCompatActivity {

 Button addUser;
ArrayList<String> list;
ArrayAdapter<String> adapter;
DatabaseHelper dbManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    addUser = findViewById(R.id.add_button);
    list = new ArrayList<>();
    adapter = new ArrayAdapter<>(this, R.layout.populate_list, R.id.name, list);
    dbManager = new DatabaseHelper(this);


    addUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addAccount();
        }
    });

}

public void addAccount() {
    Intent intent = new Intent(MainActivity.this, AddUser.class);
    startActivityForResult(intent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 1) {
        final String name = intent.getStringExtra("name");
        final String occupation = intent.getStringExtra("occupation");
        ListView listView = findViewById(R.id.parentLayout);

        dbManager.read();
        list.add(name);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent i = new Intent(MainActivity.this, UpdateActivity.class);
                i.putExtra(name, "username");
                i.putExtra(occupation, "occupation");
                startActivity(i);

            }
        });
    }
}
}
  

AddUser.class

импортируйте android.content.Намерение; импорт android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.view.View; импорт android.widget.Кнопка; импортировать android.widget.Редактировать текст;

публичный класс AddUser расширяет AppCompatActivity {

 EditText userName, job;
Button submitButton, cancelButton;

DatabaseHelper dbManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_user);
    dbManager = new DatabaseHelper(this);
    userName = findViewById(R.id.userText);
    job = findViewById(R.id.occupation);
    submitButton = findViewById(R.id.submit_button);
    cancelButton = findViewById(R.id.cancel_button);

    cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(AddUser.this, MainActivity.class);
            startActivity(intent);
        }
    });
    submitButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = getIntent();
            String name = userName.getText().toString();
            String desc = job.getText().toString();
            intent.putExtra(name, "name");
            intent.putExtra(desc, "occupation");
            dbManager.insert(name, desc);
            setResult(1, intent);
            finish();

        }
    });
}

  }
  

Ответ №1:

Вы можете попробовать использовать rawquery, подобный этому :

 String sql = " SELECT * FROM "   TABLE_NAME   " WHERE "   ONE_COLUMN_NAME   "=?"   " AND "   PERHAPS_ANOTHER_COLUMN   " =?";
    ArrayList<YourKindOfObject> array = new ArrayList<>();
    Cursor cursor = sqLiteDatabase.rawQuery(sql, new String[]{firstParameter, secondParameter});
    while (cursor.moveToNext()) {

        YourKindOfObject yourKindOfObject = new YourKindOfObject();
        yourKindOfObject.setOneThing(cursor.getString(cursor.getColumnIndex(ColumnName));
        yourKindOfObject.setOneOtherThing(cursor.getString(cursor.getColumnIndex(ColumnName1)));
        array.add(yourKindOfObject);
    }
    cursor.close();
    return array;
  

Комментарии:

1. куда я должен добавить это на самом деле? Должен ли я добавить этот запрос вместо myDb.query() в read()?

2. Спасибо. Я пытаюсь это сделать

3. если ответ правильный, пожалуйста, отметьте его как разрешенный