2016-06-27 6 views
0

Ich habe Daten vom Server in UI durch Realm und Volley gefüllt. Ist es möglich, diese Daten lokal zu speichern und in der Benutzeroberfläche von lokalen db anzuzeigen? Und wie es geht? Jedes Beispiel wäre sehr hilfreich. Danke. Eigentlich versuche ich, die Daten lokal zu holen, nachdem ich die Daten vom Server abgerufen und gefüllt habe.Wie lade ich Daten aus dem lokalen Bereich db?

if(realm!=null){ 
     Log.d(AppConstants.TAG, "realm fetching"); 
     RealmResults<SellerProducts> sellerProductItems=realm.where(SellerProducts.class).findAll(); 

     adapter.setData(sellerProductItems); 
     adapter.notifyDataUpdate(); 
    }else { 
     //network fetch operation 
     // getting data 
     //populating data like this 
     sellerProductItems= gson.fromJson(products.toString(), new TypeToken<List<SellerProducts>>(){}.getType()); 
      //Products is from server response 
      realm.beginTransaction(); 
      realm.copyToRealmOrUpdate(sellerProductItems); 
      realm.commitTransaction(); 
      adapter.setData(sellerProductItems); 
      adapter.notifyDataUpdate(); 
    } 

Ist es korrekt?

+0

sollten Sie verweisen Realm [Dokumentation] (https://realm.io/docs/java/latest/). Es deckt alle Details ab –

+0

Das klingt konzeptionell falsch für mich, wie wie kann man sogar "realm == null" in Ihrem Code haben, ganz zu schweigen davon, dass Sie völlig ignorieren, in welchem ​​Thread Sie die Netzwerkoperation ausführen oder abfragen der Bereich – EpicPandaForce

Antwort

1

Daten in diese Welt zu retten ein Reich-Objekt erstellen und tun Transaktion wie diese

myRealm.beginTransaction(); 

// Create an object 
Country country1 = myRealm.createObject(Country.class); 
country1.setName("Norway"); 
country1.setPopulation(5165800); 
country1.setCode("NO"); 
myRealm.commitTransaction(); 

die Daten

RealmResults<Country> results1 = 
    myRealm.where(Country.class).findAll(); 
for(Country c:results1) { 
Log.d("results1", c.getName()); 
} 

Ausführliche Informationen finden Sie unter http://code.tutsplus.com/tutorials/up-and-running-with-realm-for-android--cms-25241

+0

Aakash, ich habe meine Frage bearbeitet, ist es richtig oder nicht? Ich denke, das erste Mal Netzwerk Fetch-Operation ausgeführt und danach, wenn das Netzwerk weg ist, sollte es aus realm.am holen ich richtig oder falsch? –

0

Keine gespeichert zu lesen, Sie bin völlig falsch. Wenn Sie es richtig machen, realm kann nie null an diesem Punkt in Ihrem Code sein.

Anyways funktioniert es vage wie folgt aus (basierend auf this):

public class GsonRequest<T extends RealmObject> extends Request<T> { 
    private final Gson gson = new Gson(); 
    private final Listener<T> listener; 

    /** 
    * Make a GET request and return a parsed object from JSON. 
    * 
    * @param url URL of the request to make 
    */ 
    public GsonRequest(Method method, String url, 
      Listener<T> listener, ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = listener; 
    } 

    @Override 
    protected void deliverResponse(T response) { 
     listener.onResponse(response); 
    } 

    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String json = new String(
        response.data, 
        HttpHeaderParser.parseCharset(response.headers)); 
      final List<T> result = gson.fromJson(json, new TypeToken<ArrayList<T>>() {}.getType()); 
      Realm realm = null; 
      try { 
       realm = Realm.getInstance(realmConfiguration); //get realm config 
       realm.executeTransaction(new Realm.Transaction() { 
        for(T t : result) { 
         realm.copyToRealmOrUpdate(t); 
        }   
       }); 
      } finally { 
       if(realm != null) { 
        realm.close(); 
       } 
      } 
      return Response.success(null, //returning null because 
              //Realm handles all reload of data on UI thread 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JsonSyntaxException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

Und

Realm realm; 
RealmResults<SellerProducts> results; 
final RealmChangeListener<RealmResults<SellerProducts>> realmChangeListener; 

SellerProductsAdapter adapter; 

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    realm = Realm.getInstance(this); 
    results = realm.where(SellerProducts.class).findAll(); 
    realmChangeListener = new RealmChangeListener<RealmResults<SellerProducts>>() { 
     @Override 
     public void onChange(RealmResults<SellerProducts> element) { 
       adapter.notifyDataSetChanged(); 
     } 
    } 
    setContentView(R.layout.retrofit_is_better_than_volley); 
    ListView whyIsThisNotRecyclerView = (ListView) findViewById(R.id.not_recycler_for_some_reason_view); 
    adapter = new SellerProductsAdapter(this, results); 
    whyIsThisNotRecyclerView.setAdapter(adapter); 

    results.addChangeListener(realmChangeListener); 
} 

@Override 
public void onDestroy() { 
    if(results != null && results.isValid()) { 
     results.removeChangeListener(realmChangeListener); 
    } 
    if(realm != null) { 
     realm.close(); 
    } 
    super.onDestroy(); 
} 

Und dann so etwas wie

GsonRequest<SellerProducts> request = new GsonRequest(Method.GET, url, 
    new Response.Listener<SellerProducts>() { 
     @Override 
     public void onResponse(SellerProducts nullObject) { 
      // hide dialog or something 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d(TAG, "Error: " + error.getMessage()/*, exception? */); 
      // hide dialog or something 
     } 
    }); 

//add to request queue 
0

Wenn Sie planen, Realm zu bringen Dein Produktionscode, es braucht mehr als das, was hier besprochen wird, Realm ist eine große Bibliothek a Es gibt auch einige Einschränkungen wie Realm, RealmObject und RealmResults, die nicht über Threads übergeben werden können.

Um dieses Problem zu lösen, benötigen Sie eine gute Architektur, in der Realm vom Rest des Codes isoliert ist. Erstellen Sie ein realmModel für jedes jsonModel und ein DAO (Data Access Object). Alle Realm-bezogenen Berechnungen sollten Teil von DAO sein, damit keiner Ihrer Code-Basis etwas über Realm wissen muss. Hier

ist ein Artikel über Realm Best Practices mit einem guten architechture https://medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f

auch ein Beispielprojekt demonstriert Integration von Realm auf Android mit MVP (Model-View-Presenter), RxJava, Retrofit, Dolch, Anmerkungen & Testing. https://github.com/viraj49/Realm_android-injection-rx-test

Verwandte Themen