如何从本地域db加载数据?

时间:2016-06-27 11:21:49

标签: android android-studio realm

我已经通过领域和凌空从UI中填充了服务器中的数据。 是否可以在本地存储该数据并在本地数据库的UI中显示?怎么做? 任何一个例子都会非常有用。谢谢。 实际上我试图在从服务器获取和填充数据后本地获取数据。

    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();   
     } 

这是对的吗?

3 个答案:

答案 0 :(得分:1)

要在领域中保存数据,请创建一个领域对象并像这样执行事务

= @products.each do |product|
 .product
   = link_to new_product_order_path(product) do
     = product.name
     = product.price

阅读保存的数据

def new
  @product = Product.find(params[:product_id])
  @order = @product.orders.new
end

有关完整信息,请访问 http://code.tutsplus.com/tutorials/up-and-running-with-realm-for-android--cms-25241

答案 1 :(得分:0)

不,你完全错了。如果你做得对,那么代码中的realm永远不会是null

无论如何,它的工作模糊(基于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));
        }
    }
}

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();
}

然后像

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

答案 2 :(得分:0)

如果您计划将Realm引入生产代码,它需要的内容比此处讨论的要多,Realm是一个主要的库,还有一些限制,如Realm,RealmObject和RealmResults不能跨线程传递。

要解决此问题,您需要一个良好的架构,其中Realm与其余代码隔离开来。为每个jsonModel和DAO(数据访问对象)创建一个realmModel。所有与Realm相关的计算都应该是DAO的一部分,因此您的代码库都不需要了解Realm。

这是一篇关于Realm最佳实践的文章,其中有一个很好的架构https://medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f

此外,一个示例项目演示了Android上的Realm与MVP(模型视图演示者),RxJava,Retrofit,Dagger,Annotations&amp;测试。 https://github.com/viraj49/Realm_android-injection-rx-test