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:
- Almacenar valores dobles en SQLite: ¿cómo asegurar la precisión?
- ¿Está correcta la documentación de Android Cursor.moveToNext ()?
- Cómo almacenar la contraseña SQLcipher localmente
- Seguridad de base de datos Sqlite
- Calcular la distancia entre dos puntos directamente en SQLite
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
- Se ha eliminado una columna no válida al intentar consultar una columna.
- Cambiar el número de versión de la base de datos SQLite
- ¿Cómo obtener contactos en orden de sus próximos cumpleaños?
- Android - Almacenamiento de datos confidenciales en la base de datos sqlite
- Obteniendo un valor único de SQLite en android
- Sincronizar SQLite DB en la aplicación android con el DB remoto de MySQL
- Actualizar una columna como suma de otras dos columnas
- ¿Hay alguna forma de implementar la búsqueda de texto completo (FTS) en SQlite de la plataforma Android?
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 !!