首页 > 解决方案 > 插入这些值后如何在数据库中查看这些值,以便以后访问它们?

问题描述

我目前正在 android studio 中设置一个 dungeons & Dragons 移动应用程序,我希望能够查看我当前保存到数据库“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();

我一直试图获得的是从数据库中读取新数据并显示它的成功方法,以便用户可以看到他们角色的最终结果。

标签: androiddatabaseandroid-sqlite

解决方案


这显示了一种获取值的方法,以便您可以查看它们:-

    // 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 is 1 name is Character className is Fighter race is Human

想要寻找可以使用的特定示例:-

    // 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();
        }
    });
}

此示例导致:-

在此处输入图像描述


推荐阅读