#android #database #android-sqlite
#Android #База данных #android-sqlite
Вопрос:
В настоящее время я настраиваю мобильное приложение dungeons amp; Dragons в android studio и хочу иметь возможность просматривать значения для персонажа, которые я в настоящее время сохраняю в базе данных «CharacterDB». Как я могу реализовать это таким образом, чтобы я мог найти значения, чтобы извлечь их для последующего использования? Любая помощь или совет будут иметь большое значение, спасибо.
Я уже пытался использовать метод запроса для выбора элементов в текущей строке, но безрезультатно. Всякий раз, когда я пытался настроить правильный запрос с помощью курсора, он сообщал, что курсор будет равен NULL всякий раз, когда я пытался перебрать его.
///////////////////// Что у меня есть в настоящее время /////////////////////
CharacterBaseHelper helper = new CharacterBaseHelper(getContext());
SQLiteDatabase Character = helper.getReadableDatabase();
ContentValues values = new ContentValues();
//Inserting test values into the Database
values.put(CharacterDB.CharacterTable.CharactersColumns.NAME,
"Character");
values.put(CharacterDB.CharacterTable.CharactersColumns.CLASS_NAME,
"Fighter" );
values.put(CharacterDB.CharacterTable.CharactersColumns.RACE, "Human" );
//saving the row ID for late use
Long newCharacterRowId =
Character.insert(CharacterDB.CharacterTable.TABLE_NAME, null , values);
///////////////////////////////////////////////
Тогда это таблица, которую я создаю для значений и вспомогательного класса
//////////////////////////////////////////////
public final class CharacterTable
{
public static final String TABLE_NAME = "character";
public final class CharactersColumns implements BaseColumns
{
public static final String NAME = "name";
public static final String CLASS_NAME = "className";
public static final String RACE = "race";
}
///////////////////
Вспомогательный класс
///////////////////
public class CharacterBaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DATABASE_NAME = "characterDB.db";
public CharacterBaseHelper(Context context){
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(
"create table " CharacterTable.TABLE_NAME "(" " _id integer primary
key autoincrement, "
CharacterTable.CharactersColumns.NAME
"," CharacterTable.CharactersColumns.CLASS_NAME
"," CharacterTable.CharactersColumns.RACE ")");
/////////////////////
Наконец, то, что я пробовал раньше
////////////////////
String[] projection = {
BaseColumns._ID,
CharacterDB.CharacterTable.CharactersColumns.NAME,
CharacterDB.CharacterTable.CharactersColumns.HIT_DICE,
};
String selection = CharacterDB.CharacterTable.CharactersColumns.NAME " = ?";
String[] selectionArgs = { "Character" };
String sortOrder =
CharacterDB.CharacterTable.CharactersColumns.HIT_DICE " DESC";
Cursor cursor = Character.query(
CharacterDB.CharacterTable.TABLE_NAME, // The table to query
projection, // The array of columns to return (pass null to get all)
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
List item = new ArrayList<>();
while(cursor.moveToNext()) {
long itemId = cursor.getLong(
cursor.getColumnIndexOrThrow(CharacterDB.CharacterTable.CharactersColumns._ID));
item.add(itemId);
}
cursor.close();
То, что я пытался получить, — это успешный способ считывания новых данных из базы данных и отображения их, чтобы пользователь мог видеть конечный результат своего персонажа.
Ответ №1:
Это показывает способ получения значений, чтобы вы могли их просмотреть :-
// all rows are gotten
Cursor AllCharacter = Character.query(CharacterTable.TABLE_NAME,null,null,null,null,null,null);
while (AllCharacter.moveToNext()) {
Log.v("ALLCHARACTER", BaseColumns._ID " is " AllCharacter.getLong(AllCharacter.getColumnIndex(BaseColumns._ID))
" " CharacterTable.CharactersColumns.NAME " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.NAME))
" " CharacterTable.CharactersColumns.CLASS_NAME " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.CLASS_NAME))
" " CharacterTable.CharactersColumns.RACE " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.RACE))
);
}
в журнале будет строка типа
ALLCHARACTER: _id — это 1 имя персонажа, имя класса — истребитель, раса — человек
Желая найти конкретный пример, который вы могли бы использовать :-
// getting a specific row examle using the _id column
Cursor OneCharacter = Character.query(CharacterTable.TABLE_NAME,
// Pramater 2 columns specific null all columns
new String[]{
CharacterTable.CharactersColumns.NAME,
CharacterTable.CharactersColumns.CLASS_NAME,
CharacterTable.CharactersColumns.RACE,
BaseColumns._ID
},
BaseColumns._ID "=?", // WHERE bit no WHERE writting use ? for no SQL injectioning with 4th paramter
new String[]{"1"}, // 1th ? changes 1st ? 3rd parameter and soing on
null,null,null
);
Вы можете использовать ListView для просмотра большого количества строк с помощью SimpleCursorAdapter. Например
//Add another row the ListView
values.clear();
values.put(CharacterTable.CharactersColumns.NAME,"CharacaterMore");
values.put(CharacterTable.CharactersColumns.CLASS_NAME,"Defencer");
values.put(CharacterTable.CharactersColumns.RACE,"Maceman");
Character.insert(CharacterTable.TABLE_NAME,null,values);
// all rows
// Using final is not good but for ease has been used
final Cursor AllCharacter = Character.query(CharacterTable.TABLE_NAME,null,null,null,null,null,null);
while (AllCharacter.moveToNext()) {
Log.v("ALLCHARACTER", BaseColumns._ID " is " AllCharacter.getLong(AllCharacter.getColumnIndex(BaseColumns._ID))
" " CharacterTable.CharactersColumns.NAME " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.NAME))
" " CharacterTable.CharactersColumns.CLASS_NAME " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.CLASS_NAME))
" " CharacterTable.CharactersColumns.RACE " is " AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.RACE))
);
}
// ListView example
ListView AllCharacterListView = (ListView) findViewById(R.id.allcharacter);
SimpleCursorAdapter AllCharacterListAdapter = new SimpleCursorAdapter(this, // getContext if fragment
android.R.layout.simple_list_item_2,
AllCharacter,
new String[]{CharacterTable.CharactersColumns.NAME, CharacterTable.CharactersColumns.RACE},
new int[]{android.R.id.text1,android.R.id.text2},
0
);
AllCharacterListView.setAdapter(AllCharacterListAdapter);
// Adding onItemClick listener to show a Toast for the clicked item
AllCharacterListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(view.getContext(),
"Item clicking sees " String.valueOf(id)
AllCharacter.getString(AllCharacter.getColumnIndex(CharacterTable.CharactersColumns.NAME)) ,
Toast.LENGTH_LONG).show();
}
});
}
Этот пример приводит к :-
Комментарии:
1. Большое вам спасибо, это именно то, что мне было нужно! Еще один вопрос, смогу ли я передать свою переменную newRowId в символ. запрос, чтобы получить, просто просматривает определенную строку?
2. @JoeHarkins это возможно, да. 3-й и 4-й для использования параметров. Они являются частью SQL where (не ГДЕ, как он закодирован), 4-е — это string[] значения, поэтому нет SQL-инъекции для замены? в 3-м параметре. например, 3-й параметр равен «_id=?», а с 4-м параметром — новая строка []{«1»} для поиска строки с идентификатором 1. Глядя на запрос, он объяснил. это 4-й из 4 типов методов.
3. @JoeHarkins Пожалуйста, с благодарностью отметьте ответ за помощь.