java - objeto - Guardando ArrayList en la base de datos SQLite en Android
bundle android ejemplo (7)
Hay una manera más fácil de hacer tal cosa de una manera completamente diferente. puede hacer una cadena que consta de todos los valores de su matriz. para eso, haga un StringBuilder y agregue los valores de forma continua y fuera de código con un separador (como un símbolo que no usará en los valores de su matriz, por ejemplo, virtual ''|''. en el código, por ejemplo:
double[] mylist = new double[]{23, 554, 55};
StringBuilder str = null;
str = new StringBuilder();
for(int i=0;i<mylist.length;i++){
str.append(mylist[i]+"|");
}
String result = str.toString();
db.open();
db.insert(result);
db.close();
Cuando quieras buscarlos y usar los valores. obtener la columna de la base de datos purificada a Cadena y con la operación splite () purificar cada valor de la matriz en una columna de la matriz de la que u puede usarla fácilmente :)
vamos a hacerlo en codigo:
String str = db.getdata();
String[] list = str.split("|");
con un simple converso puedes usarlos como doble;
double mydouble = Double.parsDouble(list[1].toString());
tal vez no sea estándar pero es útil, espero ayuda;)
He estado trabajando con SQLite en Android y me gustaría agregar un arraylist a una columna en una tabla y luego recuperar los datos como un arraylist. El arraylist es una lista de Longs. Me he dado cuenta de que SQL tiene una opción para almacenar BLOBS, sin embargo, parece que necesito convertir el arraylist a un byte [] antes de poder almacenarlo como un blob en mi base de datos SQLite.
Si alguien tiene una solución sobre cómo guardar los arrailistas en una base de datos SQLite que sería muy apreciada. ¿O hay alguna otra opción para guardar mi matriz de datos, debería considerar?
Para insertar :
ArrayList<String> inputArray=new ArrayList<String>();
//.... Añadir valores a inputArray
Gson gson = new Gson();
String inputString= gson.toJson(inputArray);
System.out.println("inputString= " + inputString);
use "inputString" para guardar el valor de ArrayList en la base de datos SQLite
Para recuperar
Obtenga la Cadena desde la SQLiteDatabse lo que guardó y cambió en el tipo ArrayList como a continuación: outputarray es una Cadena que se obtiene de SQLiteDatabase para este ejemplo.
Type type = new TypeToken<ArrayList<String>>() {}.getType();
ArrayList<String> finalOutputString = gson.fromJson(outputarray, type);
- En SQLite use texto como formato para almacenar la cadena Valor .....
Parece que quieres serializar la lista. Aquí hay un tutorial / introducción a la API de serialización de Java.
Por favor, perdóneme por plagiar salvajemente mi respuesta anterior a BLOB vs. VARCHAR para almacenar arreglos en una tabla de MySQL . Las otras respuestas son también muy pertinentes.
Creo que el enfoque de Con es probablemente mejor que usar la serialización de Java ya que la serialización integrada de Java necesitará bytes adicionales, y las aplicaciones que no sean de Java tendrán más dificultades para manejar los datos.
public static void storeInDB(ArrayList<Long> longs) throws IOException, SQLException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
for (long l : longs) {
dout.writeLong(l);
}
dout.close();
byte[] asBytes = bout.toByteArray();
PreparedStatement stmt = null; // however you get this...
stmt.setBytes(1, asBytes);
stmt.executeUpdate();
stmt.close();
}
public static ArrayList<Long> readFromDB() throws IOException, SQLException {
ArrayList<Long> longs = new ArrayList<Long>();
ResultSet rs = null; // however you get this...
while (rs.next()) {
byte[] asBytes = rs.getBytes("myLongs");
ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
DataInputStream din = new DataInputStream(bin);
for (int i = 0; i < asBytes.length/8; i++) {
longs.add(din.readLong());
}
return longs;
}
}
Nota: si sus listas a veces contendrán más de 31 largos (248 bytes), entonces necesitará usar BLOB. No puede usar BINARY () o VARBINARY () en MySQL. Me doy cuenta de que está preguntando sobre SQLite, pero con el espíritu de plagiar completamente mi respuesta anterior, pretenderé que está preguntando sobre MySQL:
mysql> CREATE TABLE t (a VARBINARY(2400)) ;
ERROR 1074 (42000): Column length too big for column ''a'' (max = 255);
use BLOB or TEXT instead
Tenía dos ArrayList<String>
, ambas más de 1000 entradas. Miré blobs y bytes, pero para mí, la solución para acelerar el proceso y hacer que sea utilizable fue cambiar el método de inserción y deshacerse de database.insert
: here está el crédito.
private static final String INSERT = "insert into "
+ YOUR_TABLE_NAME+ " (" + COLUMN_1 + ", "
+ COLUMN_2 + ") values (?, ?)";
public void insertArrayData(ArrayList<String> array1,
ArrayList<String> array2) {
try {
database.open();
} catch (SQLException e) {
e.printStackTrace();
}
int aSize = array1.size();
database.beginTransaction();
try {
SQLiteStatement insert = database.compileStatement(INSERT);
for (int i = 0; i < aSize; i++) {
insert.bindString(1, array1.get(i));
insert.bindString(2, array2.get(i));
insert.executeInsert();
}
database.setTransactionSuccessful();
} catch (SQLException e) {
e.printStackTrace();
} finally {
database.endTransaction();
}
try {
database.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Es fácilmente adaptable a Longs, Integers, etc. y aligeramiento rápido. Así que, afortunadamente, ¡ya no tuve que rascarme la cabeza por blobs y bytes! Espero eso ayude.
Tendrá que hacerlo manualmente, revisar cada elemento de la lista y cambiarlo a byte antes de almacenarlo en la base de datos.
for (long l : array<long>){
//change to byte here
//Store in database here
}
ArrayList<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
list.add("Item 3");
String joined = TextUtils.join(",", list);
Log.i(TAG, "joined strings: " + joined);
String[] array = TextUtils.split(joined, ",");
Log.i(TAG, "joined strings: " + array[0] + array[1] + array[2]);