2016-08-15 4 views
0

New! 영역에서 데이터를 검색 할 때 문제가 발생했습니다. 나는 retrofit을 사용하고, Realm (Successful for Sqlite)을 사용하여 데이터를 저장하고 싶지만 데이터베이스에서 데이터를 검색하는 동안 나는 그것을 게시 한 오류가있다.렐름에서 데이터를 가져 오는 중 오류가 발생했습니다.

package np.com.rabindraacharya.retrofitintern.ui; 

import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

import java.util.List; 

import np.com.rabindraacharya.retrofitintern.Controller.RestManager; 
import np.com.rabindraacharya.retrofitintern.R; 
import np.com.rabindraacharya.retrofitintern.model.Flower; 
import np.com.rabindraacharya.retrofitintern.model.adapter.FlowerAdapter; 
import np.com.rabindraacharya.retrofitintern.model.helper.Constants; 
import np.com.rabindraacharya.retrofitintern.model.helper.FlowerDatabase; 
import np.com.rabindraacharya.retrofitintern.model.helper.Utils; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

public class MainActivity 
     extends AppCompatActivity 
     implements FlowerAdapter.FlowersClickListener { 
    private RecyclerView recyclerView; 
    private RestManager mManager; 
    FlowerAdapter mFlowerAdapter; 
    FlowerDatabase mDatabase; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show(); 
      } 
     }); 

     configViews(); 
     mManager = new RestManager(); 
     mDatabase = new FlowerDatabase(); 
     if(Utils.isNetworkAvailable(getApplicationContext())) { 
      getFeed(); 
     } else { 
      getFeedFromDatabase(); 
     } 
    } 

    private void getFeedFromDatabase() { 
     Log.e("RetData", "RetData"); 
     List<Flower> flowerList = mDatabase.getFlower(); 
     for(int i = 0; i < flowerList.size(); i++) { 
      Flower flower = flowerList.get(i); 
      mFlowerAdapter.addFlower(flower); 
     } 
    } 

    private void configViews() { 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 

     LinearLayoutManager verticalLayoutmanager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false); 
     recyclerView.setLayoutManager(verticalLayoutmanager); 
     mFlowerAdapter = new FlowerAdapter(this); 
     recyclerView.setAdapter(mFlowerAdapter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if(id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onClick(int position) { 
     Flower selectedFlower = mFlowerAdapter.getSelectedFlower(position); 
     Intent intent = new Intent(MainActivity.this, DetailActivity.class); 
     intent.putExtra(Constants.REFERENCE.FLOWER, selectedFlower); 
     startActivity(intent); 
    } 

    public void getFeed() { 
     Call<List<Flower>> listCall = mManager.getFlowerService().getAllFlowers(); 
     listCall.enqueue(new Callback<List<Flower>>() { 
      @Override 
      public void onResponse(Call<List<Flower>> call, Response<List<Flower>> response) { 
       if(response.isSuccessful()) { 
        List<Flower> flowerList = response.body(); 
        for(int i = 0; i < flowerList.size(); i++) { 
         Flower flower = flowerList.get(i); 

         SaveIntoDatabase task = new SaveIntoDatabase(); 
         task.execute(flower); 
         mFlowerAdapter.addFlower(flower); 
        } 
       } else { 
        int st = response.code(); 
        switch(st) { 
        } 
       } 
      } 

      @Override 
      public void onFailure(Call<List<Flower>> call, Throwable t) { 
      } 
     }); 
    } 

    public class SaveIntoDatabase 
      extends AsyncTask<Flower, Flower, Boolean> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Boolean doInBackground(Flower... params) { 
      Flower flower = params[0]; 
      try { 
       //InputStream stream = new URL("http://services.hanselandpetal.com/photos/" + flower.getPhoto()).openStream(); 
       // Bitmap bitmap = BitmapFactory.decodeStream(stream); 
       //flower.setPicture(bitmap); 
       mDatabase.addFlower(flower); 
       Log.e("ErrorAft", "ErrorAft"); 
      } catch(Exception e) { 

      } 
      return null; 
     } 
    } 
} 

을 FlowerDatabase
package np.com.rabindraacharya.retrofitintern.model.helper; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import java.util.ArrayList; 
import java.util.List; 

import io.realm.Realm; 
import io.realm.RealmResults; 
import np.com.rabindraacharya.retrofitintern.model.Flower; 
import np.com.rabindraacharya.retrofitintern.model.adapter.FlowerAdapter; 

/** 
* Created by Rabindra on 8/12/2016. 
*/ 
public class FlowerDatabase 
     extends AppCompatActivity { 
    private Realm myRealm; 
    private int productID; 
    private static FlowerDatabase flowerDatabase; 
    private static List<Flower> arrayListFlower = new ArrayList<>(); 
    private FlowerAdapter flowerAdapter; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myRealm = Realm.getDefaultInstance(); 
     flowerDatabase = this; 
    } 

    public void addFlower(Flower model) { 
     Log.e("RealmData", "RealmData"); 
     myRealm.beginTransaction(); 
     Flower flower = myRealm.createObject(Flower.class); 
     flower.setProductId(model.getProductId()); 
     flower.setCategory(model.getCategory()); 
     flower.setName(model.getName()); 
     flower.setPrice(model.getPrice()); 
     flower.setInstruction(model.getInstruction()); 
     arrayListFlower.add(flower); 
     myRealm.commitTransaction(); 
     flowerAdapter.notifyDataSetChanged(); 
    } 

    public List<Flower> getFlower() { 
     Flower model = new Flower(); 
     productID = model.getProductId(); 

     RealmResults<Flower> results = myRealm.where(Flower.class).findAll(); 
     myRealm.beginTransaction(); 

     for(int i = 0; i < results.size(); i++) { 
      arrayListFlower.add(results.get(i)); 
     } 
     if(results.size() > 0) { 
      productID = myRealm.where(Flower.class).max("id").intValue() + 1; 
     } 
     myRealm.commitTransaction(); 
     flowerAdapter.notifyDataSetChanged(); 
     return arrayListFlower; 
    } 
} 

오류 로그 캣 :

N E/AndroidRuntime : 치명적인 예외 : 주요 프로세스 : np.com.rabindraacharya.retrofitintern, PID : 17091

java.lang.RuntimeException : 활동을 시작할 수 없습니다. 에서 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2317)에서 java.lang.NullPointerException이 : 1,363,210 ComponentInfo {/ np.com.rabindraacharya.retrofitintern np.com.rabindraacharya.retrofitintern.ui.MainActivity} android.app.ActivityThread.access $ 900 android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2375) android.app.ActivityThread $ H.handleMessage에서 (ActivityThread.java:164) (ActivityThread.java:1268) android.os.Handler.dispatchMessage (Handler.java:102) android.os.Looper.loop (Looper.java:157) 012 java.lang.reflect.Method.invoke (Method.java:515)에서 java.lang.reflect.Method.invokeNative (기본 방법) 에서 android.app.ActivityThread.main (ActivityThread.java:5377) 에서 3,516, com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1265) (ZygoteInit.java:1081) dalvik.system.NativeStart에서 에서. main (네이티브 메소드) 발생 원인 : java.lang.NullPointerException at np.com.rabindraacharya.retrofitintern.model.helper.FlowerDatabase.getFlower (FlowerDataba se.java:70) np.com.rabindraacharya.retrofitintern.ui.MainActivity.onCreate에서 np.com.rabindraacharya.retrofitintern.ui.MainActivity.getFeedFromDatabase (MainActivity.java:69) (MainActivity.java에서 : 63) android.app.ActivityThread.performLaunchActivity에서 android.app.Activity.performCreate android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1105에서 (Activity.java:5428) ) (ActivityThread.java에서 : 2281) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2375)android.app.ActivityThread.access $ (900) (ActivityThread.java:164) android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1268) android.os.Handler.dispatchMessage에서 (Handler.java에서에서: 102) android.os.Looper.loop (Looper.java:157) android.app.ActivityThread.main (ActivityThread.java:5377) at java.lang.reflection.Method.invokeNative (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1265) 이 줄은 여기 myRealm.where(Flower.class).max("id").intValue() + 1; 더 플라워 경우 NullPointerException이 발생합니다

+0

1. 어떤 버전의 Realm을 사용하고 있습니까? 2.) 그 클래스가 완전히 틀리기 때문에'FlowerDatabase'에서 무엇을하려고 했습니까? – EpicPandaForce

+0

마지막으로 문제를 해결합니다. 고마워요. 당신의 의견 –

답변

0

dalvik.system.NativeStart.main에서 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1081) 에서 (기본 방법) 개체가 존재합니다. max이 경우 null를 반환 https://realm.io/docs/java/latest/api/io/realm/RealmQuery.html#max-java.lang.String-

당신은 진짜 유효한 이유로 FlowerDatabase 클래스와 AppCompatActivity를 확장하는 시도 할 수 있지만, mDatabase = new FlowerDatabase();으로 flowerDatabase을 인스턴스화하기 때문에 onCreate()가 실행되지 않습니다, 따라서 시스템에 의해 관리되지 않습니다
+0

더 자세히 설명해 주시겠습니까? 나는 요점을 얻을 수없고, 내가 가진 문제를 해결할 수 없다. –

+0

그는 그보다 더 근본적인 문제가있었습니다. – EpicPandaForce

0

.

(처음에는 활동이 아니기도합니다. 활동이 있었던 것처럼 Intent으로 작성해야합니다).

기술적으로 개념적으로 잘못 되었기 때문에 기술적으로 코드를 다시 작성해야합니다.

특히 귀하의 FlowerDatabase 클래스는 전적으로 귀하가 영역을 오용하고 있기 때문에 완전히 사용하고 있습니다.

관련 문제