Сохранение ArrayLists в базах данных SQLite - PullRequest
16 голосов
/ 18 апреля 2011

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

Как мне сохранить этот массив в записи в базе данных SQLite?Я имею в виду ... каким должен быть тип столбцов?Можно ли это сделать?

Ответы [ 6 ]

52 голосов
/ 18 апреля 2011

Вы не можете вставить ArrayList непосредственно в Sqlite. Вместо этого вы можете использовать JSONObject (org.json.JSONObject) для вставки ArrayList. Пожалуйста, проверьте ниже фрагмент, вы можете попробовать что-то вроде ниже ....

Вставить,

JSONObject json = new JSONObject();
json.put("uniqueArrays", new JSONArray(items));
String arrayList = json.toString();

Вставьте строку в БД.

Читать, Прочитать строку из БД как String,

 JSONObject json = new JSONObject(stringreadfromsqlite);
  ArrayList items = json.optJSONArray("uniqueArrays");
13 голосов
/ 09 октября 2014

Для вставки:

ArrayList<String> inputArray=new ArrayList<String>();

// .... Добавить значения к inputArray

Gson gson = new Gson();

String inputString= gson.toJson(inputArray);

System.out.println("inputString= " + inputString);


use "inputString" to save the value of ArrayList<String> in SQLite Database 

Извлечь:

Получить строку из SQLiteDatabse чтовы сохранили и изменили тип ArrayList, как показано ниже:

outputarray - это строка, полученная из базы данных SQLiteDatabase для этого примера.

Type type = new TypeToken<ArrayList<String>>() {}.getType();

ArrayList<String>  finalOutputString = gson.fromJson(outputarray, type);
1 голос
/ 18 мая 2017

В моем случае это был ArrayList классов POJO. Примечание

private String mNoteTitle;
private int mFingerIndex;
private Point mNoteCoordinates;

public Note(String noteTitle, int fingerIndex, Point noteCoordinates) {
    this.mNoteTitle = noteTitle;
    this.mFingerIndex = fingerIndex;
    this.mNoteCoordinates = noteCoordinates;
}

Как указано в руководстве, JSONObject поддерживает только следующие типы: Object: JSONObject, JSONArray, String, Boolean, Integer, Long, Double, NULL или null. Не может быть NaNs или бесконечности. Итак, я должен разбить свой класс Note на поддерживаемые объекты.

 JSONObject json = new JSONObject();
    JSONArray jsonArray = new JSONArray();

    for(Note note: chordShape.getNotes()){
        JSONObject singleNoteJsonObject = new JSONObject();

        try {
            singleNoteJsonObject.put(SHAPE_NOTE_TITLE, note.getNoteTitle());
            singleNoteJsonObject.put(SHAPE_NOTE_FINGER_INDEX, note.getFingerIndex());
            singleNoteJsonObject.put(SHAPE_NOTE_X, note.getNoteCoordinates().x);
            singleNoteJsonObject.put(SHAPE_NOTE_Y, note.getNoteCoordinates().y);
        } catch (JSONException e){
            e.printStackTrace();
        }

        jsonArray.put(singleNoteJsonObject);

    }

Упакуйте созданный массив в JSONObject.

try {
        json.put(SHAPE_NOTES, jsonArray);
        Log.i(TAG, json.toString());
    } catch (JSONException e){
        e.printStackTrace();
    }

Создать строку.

String notesList = json.toString();

Поместите созданную строку в ContentValues, потому что в моем случае это приложение для Android

if(notesList.length() > 0){
        contentValues.put(DatabaseHelper.SHAPE_NOTES_LIST, notesList);
    }

И когда я должен прочитать значения из базы данных SQLite.

ArrayList<Note> notes = new ArrayList<>();
    while(cursor.moveToNext()){
        JSONObject jsonNotes = null;
        try {
           jsonNotes = new JSONObject(cursor.getString(cursor.getColumnIndex(DatabaseHelper.SHAPE_NOTES_LIST)));
        } catch (JSONException e){
            e.printStackTrace();
        }

        if(jsonNotes != null){
            Log.i(TAG, jsonNotes.toString());
            JSONArray jsonArray = jsonNotes.optJSONArray(SHAPE_NOTES);
            for(int i = 0; i < jsonArray.length(); i++){
                Note note = null;
                JSONObject arrayObject = null;

                try {
                    arrayObject = jsonArray.getJSONObject(i);
                } catch (JSONException e){
                    e.printStackTrace();
                }

                if(arrayObject != null){
                    try {
                        note = new Note(
                            arrayObject.getString(SHAPE_NOTE_TITLE),
                                arrayObject.getInt(SHAPE_NOTE_FINGER_INDEX),
                                new Point(
                                        arrayObject.getInt(SHAPE_NOTE_X),
                                        arrayObject.getInt(SHAPE_NOTE_Y)
                                )
                        );
                    } catch (JSONException e){
                        e.printStackTrace();
                    }
                }


                if(note != null){
                    notes.add(note);
                }
            }
        }
    }
    cursor.close();
0 голосов
/ 18 апреля 2011

Мне нужно было сделать что-то похожее в моем приложении, где у меня есть собственный класс (Foo, Bar и т. Д.), И у меня есть ArrayList из foo, bar и т. Д., Который я сохраняю в SQL. Мои знания SQL не сильны, но я объясню свой подход здесь, если это поможет. Насколько я понимаю, для хранения любого типа объекта вам нужно определить конкретную таблицу для этого типа объекта, где таблица имеет отдельные столбцы, представляющие примитивные типы в этом объекте. Кроме того, чтобы сохранить и извлечь ArrayList из этих объектов, вы будете использовать одну строку таблицы на каждую запись ArrayList и выполнять итерацию в цикле для сохранения и извлечения.

В моем приложении есть ArrayLists нескольких пользовательских классов, которые я хотел сохранить в БД. Итак, чтобы привести в порядок вещи (ну, по крайней мере, для меня - я все еще относительно новый программист на Java / Android, так что давайте взяться за дело), ​​я решил реализовать своего рода «Сериализуемый интерфейс SQL», который мой DB-персистентные объекты должны быть реализованы. Каждый объект (Foo, Bar и т. Д.), Который можно сохранить в БД, должен реализовывать:

  1. Публичная статическая конечная строка TABLE_NAME, имя таблицы базы данных SQL, используемой для этого типа объекта.
  2. Публичный статический финал TABLE_CREATE_STRING, полная инструкция SQL для создания таблицы для этого объекта.
  3. Метод конструктора для заполнения его переменных-членов из объекта ContentValues.
  4. Метод 'get' для заполнения ContentValues ​​из его переменных-членов.

Итак, скажем, у меня есть ArrayLists объектов Foo и Bar. Когда БД создается впервые, в моем вспомогательном классе БД я вызываю Foo.TABLE_CREATE_STRING, Bar.TABLE_CREATE_STRING и т. Д., Чтобы создать таблицы для этих объектов.

Чтобы заполнить мой ArrayList, я использую что-то вроде:

cursor = dbh.retrieve(Foo.TABLE_NAME);
if(!cursor.moveToFirst()){
  return false
}
do{
  DatabaseUtils.cursorRowToContentValues(cursor, vales);
  FooArrayList.add( new Foo(values) );
} while( cursor.moveToNext() );
0 голосов
/ 18 апреля 2011

Создайте класс dbHelper, который имеет внутренний класс и почти все, что говорится в учебнике по блокноту. Класс должен иметь метод вставки, например, такой: -

public long insertRows(ContentValues values, String tableName) {
    long val = myDatabase.insert(tableName, null, values);
    return val;
}

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

для (i = 0; list.length (); i ++) или может быть его list.size: P

{

// Вызвать метод здесь

}

и продолжайте добавлять значение в базу данных, вызывая метод в цикле for

0 голосов
/ 18 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...