#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. если ответ правильный, пожалуйста, отметьте его как разрешенный