Cómo almacenar JSON en SQLite
Tengo problemas con el almacenamiento de datos JSON a sqlite. Este es el código que estoy tratando de implementar ahora mismo. Los datos de JSON no son particularmente grandes con sólo 40 líneas en él.
La actividad principal es:
- ¿Qué hacer con Cursor después de una consulta SQLite?
- Evitar IllegalStateException en SQLiteCursor para Android
- ¿Cómo crearía una nueva actividad donde tendría la opción de agregar nuevos elementos de la base de datos?
- Actualizar Recyclerview de otra actividad
- ¿Es posible obtener la última fecha de modificación de un archivo de activos?
public class DatabaseActivity extends Activity { /** Called when the activity is first created. */ public DBAdapter DBAdapter =new DBAdapter(this); TextView txt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Create a crude view - this should really be set via the layout resources // but since its an example saves declaring them in the XML. LinearLayout rootLayout = new LinearLayout(getApplicationContext()); txt = new TextView(getApplicationContext()); rootLayout.addView(txt); setContentView(rootLayout); // Set the text and call the connect function. txt.setText("Connecting..."); //call the method to run the data retreival txt.setText(getServerData(KEY_13)); } public static final String KEY_13 = "http://xxx.xxx.xxx/api/train.php"; private String getServerData(String returnString) { InputStream is = null; String result = ""; //the train line to send ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("code","A")); //http post try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(KEY_13); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } //convert response to string try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } //parse json data try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); DBAdapter.insertTrain(json_data.getString("id"), json_data.getString("code"), json_data.getString("station"), json_data.getString("platform"), json_data.getString("timetillstation"), json_data.getString("traindestination"), //Get an output to the screen returnString += "\n\t" + jArray.getJSONObject(i); } }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return returnString; } }
El adaptador es:
public class DBAdapter{ public static final String KEY_ID = "id"; public static final String KEY_Code = "code"; public static final String KEY_Station = "station"; public static final String KEY_Platform = "platform"; public static final String KEY_TimeTillStation = "timetillstation"; public static final String KEY_TrainDestination = "traindestination"; private static final String TAG = "DBAdapter"; private static final String DATABASE_NAME = "trains"; private static final String DATABASE_TABLE = "Mekerel"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_CREATE = "create table titles (id integer primary key, " + "code text not null," + "station text not null," + "platform text not null," + "timetillstation text not null," + "traindestination text not null);"; private final Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); this.db=DBHelper.getWritableDatabase(); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS titles"); onCreate(db); } } //---opens the database--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---closes the database--- public void close() { DBHelper.close(); } //---insert a train into the database--- public long insertTrain(String id, String code, String station, String platform, String timetillstation, String traindestination) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_ID, id); initialValues.put(KEY_Code, code); initialValues.put(KEY_Station, station); initialValues.put(KEY_Platform, platform); initialValues.put(KEY_TimeTillStation, timetillstation); initialValues.put(KEY_TrainDestination, traindestination); return db.insert(DATABASE_TABLE, null, initialValues); } //---retrieves all the ttrain--- public Cursor getAllTrains() { return db.query(DATABASE_TABLE, new String[] { KEY_ID, KEY_Code, KEY_Station, KEY_Platform, KEY_TimeTillStation, KEY_TrainDestination}, null, null, null, null, null, null); } //---retrieves a particular train--- public Cursor getTrain(long id) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] { KEY_ID, KEY_Code, KEY_Station, KEY_Platform, KEY_TimeTillStation, KEY_TrainDestination}, KEY_ID + "=" + id, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---updates a train--- public boolean updateTrain(long id, String code, String station, String platform, String timetillstation, String traindestination) { ContentValues args = new ContentValues(); args.put(KEY_Code, code); args.put(KEY_Station, station); args.put(KEY_Platform, platform); args.put(KEY_TimeTillStation, timetillstation); args.put(KEY_TrainDestination, traindestination); return db.update(DATABASE_TABLE, args, KEY_ID + "=" + id, null) > 0; } }
No estoy seguro de dónde ir desde aquí, ya que todavía hay problemas. El logcat muestra lo siguiente:
12-04 12:43:09.691: E/AndroidRuntime(21334): FATAL EXCEPTION: main 12-04 12:43:09.691: E/AndroidRuntime(21334): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{ta.dabase/ta.dabase.DatabaseActivity}: java.lang.NullPointerException 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1680) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.os.Handler.dispatchMessage(Handler.java:99) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.os.Looper.loop(Looper.java:130) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.main(ActivityThread.java:3835) 12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.reflect.Method.invokeNative(Native Method) 12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.reflect.Method.invoke(Method.java:507) 12-04 12:43:09.691: E/AndroidRuntime(21334): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 12-04 12:43:09.691: E/AndroidRuntime(21334): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 12-04 12:43:09.691: E/AndroidRuntime(21334): at dalvik.system.NativeStart.main(Native Method) 12-04 12:43:09.691: E/AndroidRuntime(21334): Caused by: java.lang.NullPointerException 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 12-04 12:43:09.691: E/AndroidRuntime(21334): at ta.dabase.DBAdapter.<init>(DBAdapter.java:43) 12-04 12:43:09.691: E/AndroidRuntime(21334): at ta.dabase.DatabaseActivity.<init>(DatabaseActivity.java:32) 12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.Class.newInstanceImpl(Native Method) 12-04 12:43:09.691: E/AndroidRuntime(21334): at java.lang.Class.newInstance(Class.java:1409) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 12-04 12:43:09.691: E/AndroidRuntime(21334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672) 12-04 12:43:09.691: E/AndroidRuntime(21334): ... 11 more
Por último, me preguntaba si alguien podría ayudarme con la depuración en un sentido de qué y dónde colocar el código de registro adecuado para detectar dónde el código va mal exactamente? Gracias
- Actualización de base de datos y aplicaciones Android SQLite
- No se pudo asignar CursorWindow
- ¿Dónde se almacena la base de datos SQLite en el emulador de Android?
- Cómo utilizar TRIGGER en Android SQLite
- Carácter turco en SQLite mientras utiliza la expresión LIKE
- Consulta de mejores prácticas de SQLite para Android
- Orden de índices de columna SQLite crea tabla
- ¿Podemos usar una base de datos SQLITE aldready preparada para una aplicación phonegap?
Para resolver este problema debe seguir estos pasos
1) Cree la clase que contiene propiedades según sus datos de json.
2) Deserialice sus datos de json en su clase. ( Mapeo de json con clase )
3) Almacene los valores de todas las propiedades de esa clase en la base de datos ( sqllite ) ( Mapeo de la clase con la base de datos )
4) **** ¡Salva tu trabajo ***!
Hecho ! ¡Disfrute Jsoning !!