Intereting Posts
Смутно о CursorLoaders и использовании их с помощью специального SQLiteOpenHelper Отображение сообщения внутри Android Редактирование текстового поля Обнаружение ограниченного сетевого подключения в Android? Android: добавьте текстовое представление в линейную компоновку программно Как я могу просмотреть команду CLI, выполненную заданием Gradle в Android Studio? FragmentActivity не может быть разрешен для типа Отказался от загрузки сценария, поскольку он нарушает следующую политику политики безопасности контента Как имитировать движение маршрута в реальном устройстве Android: Как настроить навигацию по настройкам, например, Android 2.1: Как мне рассчитать значение RSSI существующего соединения Bluetooth? Как приостановить анимацию кадра с помощью AnimationDrawable? Различные размеры шрифтов строк в том же TextView Android-ndk – простой скрипт сборки для ndk-build для cygwin Приложение Hello World для Android, Ошибка: workspace \ appcompat_v7 \ res \ values-v21 \ styles_base.xml Ресурс не найден, который соответствует указанному имени Заменить текущую деятельность

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

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

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

Solutions Collecting From Web of "Сохранение массивов в базе данных SQLite"

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

Вставить,

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

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

Чтение, чтение строки из db в виде строки,

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

Вставить :

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

//….Add Значения 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 

Чтобы вернуться:

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

Outputarray – это строка, которая получается из SQLiteDatabase для этого примера.

 Type type = new TypeToken<ArrayList<String>>() {}.getType(); ArrayList<String> finalOutputString = gson.fromJson(outputarray, type); 

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

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

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

  1. Публичная статическая конечная строка TABLE_NAME, имя таблицы SQL DB, используемой для этого типа объекта.
  2. Публичный статический окончательный TABLE_CREATE_STRING – полная инструкция SQL для создания таблицы для этого объекта.
  3. Метод конструктора для заполнения его переменных-членов из объекта ContentValues.
  4. Метод «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() ); 

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

Pack создал массив в 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(); в 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(); 

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

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

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

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

{

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

}

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