Сохранение массивов в базе данных SQLite
Итак, я хочу сохранить упорядоченный набор двойных значений, и я хочу иметь возможность легко вставлять, извлекать или удалять любые значения. В связи с этим я использую ArrayList, где я определяю класс Doubles для хранения двойных значений.
Как сохранить этот arraylist в записи в базе данных SQLite? Я имею в виду... каков должен быть тип столбцов? Это можно сделать?
Ответы
Ответ 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