【问题标题】:How can I view these values in the database after I insert them so that I can access them later?插入这些值后如何在数据库中查看这些值,以便以后访问它们?
【发布时间】:2019-04-21 23:17:07
【问题描述】:

我目前正在 android studio 中设置一个 dungeons & Dragons 移动应用程序,我希望能够查看我当前保存到数据库“CharacterDB”中的角色的值。我怎样才能以这样的方式实现它,让我找到值以将它们拉出来以备后用? 任何帮助或建议都会大有帮助,谢谢。

我已经尝试使用查询方法来选择当前行中的项目,但无济于事。每当我尝试使用游标设置正确的查询时,它会说每当我尝试循环游标时游标将为 NULL。

/////////////////// 我目前拥有的 //////////////////////p>

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

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

【问题讨论】:

    标签: android database android-sqlite


    【解决方案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 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();
            }
        });
    }
    

    这个例子的结果是:-

    【讨论】:

    • 非常感谢,这正是我所需要的!还有一个问题,我是否可以将我的 newRowId 变量传递给 Character.query 以通过特定的行?
    • @JoeHarkins 可能是的。第 3 和第 4 使用参数。它们是 SQL 的 where 部分(没有编码的 WHERE),第四个是 string[] 值,所以没有要替换的 SQL 注入?在第三个参数中。例如第三个参数是“_id=?”并使用第 4 个参数是 new String[]{"1"} 来查找 id 为 1 的行。查看它解释的查询。这是 4 种方法中的第 4 种。
    • @JoeHarkins 谢天谢地,请勾选答案以获得帮助。
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多