Сохранить результат запроса SQLite в массив String - PullRequest
0 голосов
/ 27 июня 2018

Как сохранить результат запроса в массиве String?
Запрос прост, у него только один столбец, т. Е.

SELECT NAME FROM MYTABLE

Я хочу сохранить идентификаторы в массиве String, чтобы я мог отображать их в виде элементов, активируемых нажатием, в ListView

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Проблема с перечислением id в том, что они имеют тенденцию быть бессмысленными для конечного пользователя. На самом деле вы хотите отобразить значимые для пользователя данные, например, имя, но затем иметь возможность доступа к соответствующему id , чтобы затем эффективно воздействовать на выбор из списка, представленного пользователю.

Использование ArrayList часто является причиной большого разочарования, так как список показывает, что требуется, но затем оказывается, что он бесполезен при попытке использовать список помимо отображения данных, например. выберите элемент, чтобы затем сделать что-то, например, удалить или обновить (если значение уникально в базе данных, его можно использовать).

Как таковой ArrayList<your_object>, а не ArrayList<String>, как правило, более жизнеспособен в качестве источника Списка; Адаптер курсора также можно использовать, поскольку данные из базовой строки легко получить.

Однако при использовании ArrayList существует проблема, если только не используется пользовательский адаптер массива, когда класс ArrayAdapter использует метод toString объекта для извлечения отображаемых данных. Простое решение заключается в предоставлении подходящего метода toString в объекте, если вы не получите что-то длинное, строки “SomeType@2f92e0f4”.

Пример, показывающий все 3

В следующем рабочем примере: -

  • база данных ( mydb ) содержит 1 таблицу с именем mytable , которая имеет два столбца _id (примечание должно быть _id для CursorAdapter)

  • Существует 3 метода для получения 3 типов списков (названных соответственно): -

    1. getAllAsStringArrayList (получает ArrayList)
    2. getAllAsMyTableObjectArrayList (получает ArrayList) . Примечание использует класс MyTableObject (см. Примечание в классе о переопределении метода по умолчанию toString )
    3. getAllAsCursor

      • Приложение при запуске будет иметь 3 списка, левый - по первому ArrayList, средний - по ArrayList, а последний - по курсору.

      • При щелчке элемента в любом из списков отображается соответствующее имя вместе с попытками получить id .

      • ArrayList , Левый список, не работает в этом аспекте, поскольку он может только получить позицию (т. Е. 4-й параметр, передаваемый слушателю, совпадает со значением позиции).

      • ArrayList, средний список, при получении id от объекта (который получен с помощью метода getItem (position) адаптера) успешно извлекает правильный id , 4-й параметр совпадает с положением и не должен использоваться.

      • Курсор, правый список, получает правильный id как с помощью курсора, так и 4-го параметра.

Код

MyTableObject.java : -

public class MyTableObject {
    private long id;
    private String name;

    public MyTableObject(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    /*
        NOTE toString method returns just the name
     */
    @Override
    public String toString() {
        return name;
    }
}

DatabaseHelper.java : -

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;
    public static final String TB_MYTABLE = "mytable";
    public static final String COl_MYTABLE_ID = BaseColumns._ID; //<<<< use standard android id column name
    public static final String COL_MYTABLE_NAME = "_name";

    private static final String mytable_crtsql =
            "CREATE TABLE IF NOT EXISTS " + TB_MYTABLE +
                    "(" +
                    COl_MYTABLE_ID + " INTEGER PRIMARY KEY, " +
                    COL_MYTABLE_NAME + " TEXT " +
                    ")";

    SQLiteDatabase mDB;

    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(mytable_crtsql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long addRow(String name) {
        ContentValues cv = new ContentValues();
        cv.put(COL_MYTABLE_NAME,name);
        return mDB.insert(TB_MYTABLE,null,cv);
    }

    public ArrayList<String> getAllAsStringArrayList() {
        ArrayList<String> rv = new ArrayList<>();
        Cursor csr = mDB.query(
                TB_MYTABLE,
                null,
                null,
                null,
                null,
                null,
                null
        );
        while (csr.moveToNext()) {
            rv.add(csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME)));
        }
        csr.close();
        return rv;
    }

    public ArrayList<MyTableObject> getAllAsMyTableObjectArrayList() {
        ArrayList<MyTableObject> rv = new ArrayList<>();
        Cursor csr = mDB.query(
                TB_MYTABLE,
                null,
                null,
                null,
                null,
                null,
                null
        );
        while (csr.moveToNext()) {
            rv.add(new MyTableObject(
                    csr.getLong(csr.getColumnIndex(COl_MYTABLE_ID)),
                    csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME))
                    )
            );
        }
        csr.close();
        return rv;
    }

    public Cursor getAllAsCursor() {
        return mDB.query(
                TB_MYTABLE,
                null,
                null,
                null,
                null,
                null,
                null
        );
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;

    ListView mListView01,mListVeiw02,mListView03;

    ArrayAdapter<String> mAdapterStringArrayList;
    ArrayAdapter<MyTableObject> mAdapterMyTableObjectArrayList;
    SimpleCursorAdapter mAdapterCursor;

    ArrayList<String> mMyTableListAsStrings;
    ArrayList<MyTableObject> mMyTableAsObjects;
    Cursor mMyTableListAsCursor;

    Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;

        mListView01 = this.findViewById(R.id.listview01);
        mListVeiw02 = this.findViewById(R.id.listview02);
        mListView03 = this.findViewById(R.id.listview03);

        mDBHlpr = new DatabaseHelper(this);
        mDBHlpr.addRow("Fred");
        mDBHlpr.addRow("Bert");
        mDBHlpr.addRow("Harry");
        mDBHlpr.addRow("Fred");

        //String Array List
        mMyTableListAsStrings = mDBHlpr.getAllAsStringArrayList();
        mAdapterStringArrayList = new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                mMyTableListAsStrings
        );
        mListView01.setAdapter(mAdapterStringArrayList);


        //Object Array List
        mMyTableAsObjects = mDBHlpr.getAllAsMyTableObjectArrayList();
        mAdapterMyTableObjectArrayList = new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                mMyTableAsObjects
        );
        mListVeiw02.setAdapter(mAdapterMyTableObjectArrayList);

        // Cursor
        mMyTableListAsCursor = mDBHlpr.getAllAsCursor();
        mAdapterCursor = new SimpleCursorAdapter(
                this,
                android.R.layout.simple_list_item_1,
                mMyTableListAsCursor,
                new String[]{DatabaseHelper.COL_MYTABLE_NAME},
                new int[]{android.R.id.text1},
                0
        );
        mListView03.setAdapter(mAdapterCursor);


        mListView01.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                String name = mAdapterStringArrayList.getItem(position);
                Toast.makeText(
                        mContext,
                        "Name is " + name  +
                                ". ID is " + String.valueOf(id) +
                                " (note may not match)",
                        Toast.LENGTH_SHORT
                ).show();
            }
        });

        mListVeiw02.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                MyTableObject mytable = mAdapterMyTableObjectArrayList.getItem(position);
                String name = mytable.getName();
                long id_in_object = mytable.getId();
                Toast.makeText(
                        mContext,
                        "Name is " + name  +
                                ". ID from object is " + String.valueOf(id_in_object) +
                                ". ID from adapter is " + String.valueOf(id),
                        Toast.LENGTH_SHORT
                ).show();
            }
        });

        mListView03.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Cursor csr = mAdapterCursor.getCursor(); // already positioned
                String name = csr.getString(csr.getColumnIndex(DatabaseHelper.COL_MYTABLE_NAME));
                long id_in_cursor = csr.getLong(csr.getColumnIndex(DatabaseHelper.COl_MYTABLE_ID));
                Toast.makeText(
                        mContext,
                        "Name is " + name  +
                                ". ID from object is " + String.valueOf(id_in_cursor) +
                                ". ID from adapter is " + String.valueOf(id),
                        Toast.LENGTH_SHORT
                ).show();
            }
        });
    }
}
0 голосов
/ 27 июня 2018

Предполагая, что вы уже выполнили свой запрос к объекту SQLiteDatabase и получили взамен Cursor, вы можете перебрать курсор и сохранить значение каждая строка в массиве String[] выглядит так:

String[] names;
if (cursor.moveToFirst()) {
    names = new String[cursor.getCount()];
    int colIndex = cursor.getColumnIndex("NAME");
    do {
        names[cursor.getPosition()] = cursor.getString(colIndex);
    } while (cursor.moveToNext());
}

Имейте в виду, что names будет null, если не будет возвращено ни одной строки, поэтому убедитесь, что вы сделали проверку на ноль.

0 голосов
/ 27 июня 2018

создать следующий метод в классе SQLiteOpenHelper

public List<String> getAllNames() {
    List<String> retData = new ArrayList<String>();
    String selectQuery = "SELECT NAME FROM MYTABLE";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            retData.add(cursor.getString(0));
        } while (cursor.moveToNext());
    }
    return retData;
}

затем назначьте этот возвращенный список адаптеру

0 голосов
/ 27 июня 2018

Попробуйте это

String selectQuery = "SELECT  * FROM table";
        try {
            Cursor cursor = db.rawQuery(selectQuery, null);
            ArrayList<String> ids = new ArrayList<>();
            // looping through all rows and adding to list
            if (cursor.moveToFirst()) {
                do {
                    String id = cursor.getString(cursor.getColumnIndex(KEY_ID));
                    ids.add(id);
                } while (cursor.moveToNext());
            }
            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();

        }
...