Как я могу просмотреть эти значения в базе данных после их вставки, чтобы я мог получить к ним доступ позже?

#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 Пожалуйста, с благодарностью отметьте ответ за помощь.