Подтвердить что ты не робот

Сохранение массивов в базе данных SQLite

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

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

4b9b3361

Ответ 1

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

Чтобы вставить,

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

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

Чтобы прочитать,        Прочитайте строку из db как String,

 JSONObject json = new JSONObject(stringreadfromsqlite);
  ArrayList items = json.optJSONArray("uniqueArrays");

Ответ 2

Вставить:

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

Ответ 3

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

Ответ 4

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

В моем приложении есть ArrayLists нескольких пользовательских классов, которые я хотел бы сохранить в БД. Итак, чтобы все было в порядке (ну, по крайней мере, для меня - я по-прежнему относительно новый Java/Android-программист, так что возьмите это с большой щепоткой). Я решил реализовать своего рода "SQL Serializable Interface", Объекты, устойчивые к БД, должны реализовываться. Каждый объект (Foo, Bar и т.д.), Который может сохраняться в БД, должен реализовывать:

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

Итак, скажем, у меня есть ArrayLists объектов Foo и Bar. Когда DB сначала создается, в моем классе помощника DB я вызываю 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() );

Ответ 5

В моем случае это был 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();

Ответ 6

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

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

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

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

{

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

}

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