2016-12-29 11 views
1

を保存しません。アンドロイドDBFlowは、私がこのようなデータベースを持っているオブジェクトに

@Database(name = QuestionDatabase.NAME, version = QuestionDatabase.VERSION) 
public class QuestionDatabase { 

    public static final String NAME = "QuestionDatabase"; // we will add the .db extension 

    public static final int VERSION = 1; 
} 

と、このようなテーブル:

@Table(database = QuestionDatabase.class) 
public class Question extends BaseModel { 
    @PrimaryKey 
    public int localID; 
    @Column 
    public int Id; 
    @Column 
    public String Answer; 
    @Column 
    public String ImageURL; 
    @Column 
    public boolean IsFavorite; 
    @Column 
    public boolean IsSolved; 
} 

およびサーバーからデータをretriveするasynctask:

public class QuestionRetriever extends AsyncTask<Integer, Void, Integer> { 

    private Activity callerActivity; 
    private QuestionAdapter questionsAdapter; 
    private List<Question> callerQuestions; 

    private Integer pageSize = 10; 

    public QuestionRetriever(Activity callerActivity, QuestionAdapter questionsAdapter, List<Question> questions){ 
     this.callerActivity = callerActivity; 
     this.questionsAdapter = questionsAdapter; 
     this.callerQuestions = questions; 
    } 

    @Override 
    protected Integer doInBackground(Integer... pageNumbers) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://192.168.1.33:313/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     QuestionWebService service = retrofit.create(QuestionWebService.class); 

     Call<List<Question>> call = service.getQuestionsPaged(pageNumbers[0].toString(), pageSize.toString()); 

     try { 
      Response<List<Question>> excecuted = call.execute(); 
      List<Question> questions = excecuted.body(); 
      FastStoreModelTransaction 
        .insertBuilder(FlowManager.getModelAdapter(Question.class)) 
        .addAll(questions) 
        .build(); 
      callerQuestions.addAll(questions); 
      callerActivity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        questionsAdapter.notifyDataSetChanged(); 
       } 
      }); 

      //Get TotalQuestionCount if not yet 
      if (((StatefulApplication) callerActivity.getApplication()).getQuestionCount() == -1){ 
       Call<Integer> call2 = service.getQuestionsSize(); 
       try { 
        ((StatefulApplication) callerActivity.getApplication()).setQuestionCount(call2.execute().body()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 

     return 1; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     //TODO: show loader 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 

     //TODO: hide loader 
    } 
} 

あなたがすべてのことを確認しているように見えます。FastStoreModelTransaction何も間違ったことはありません。エラーはありません。

初期化ジョブは、次のようにスプラッシュ画面の活動で行われます。

private void initializeEveryRun() { 
     //Initializing DBFlow 
     //DBFlow needs an instance of Context in order to use it for a few features such as reading from assets, content observing, and generating ContentProvider. 
     //Initialize in your Application subclass. You can also initialize it from other Context but we always grab the Application Context (this is done only once). 
     FlowManager.init(new FlowConfig.Builder(getApplicationContext()).build()); 
    } 

この問題またはしようとするすべてのソリューションを起こすべきかについての任意のアイデア? TG。

答えて

1

私は答えを見つけました!

Idはサーバーから取得したオブジェクトの識別子で、LocalIdはローカルに格納されている自動インクリメントIDです。これが問題でした。私はIdフィールドを主キーとして使用し、サーバ側識別子のためにOnlineIdという名前のフィールドを追加しました。

これはバグですか?それとも間違っていましたか?

TG。

1

これはトランザクションを実行するものではなく、トランザクションの作成だけです。

ご覧のとおり、このテストDBFlow - FastModelTest.ktです。

FastStoreModelTransaction .insertBuilder(FlowManager.getModelAdapter(Question.class)) .addAll(questions) .build();


あなたはこのようなあなたのトランザクションを実行する必要があります:あなたはすでにDatabaseWrapperインスタンスを持っていた場合は、<<YourTransaction>>.excute(<<YourDatabaseWrapper>>);を行うことができますが、そうでない場合
FlowManager.getDatabase(QuestionDatabase.class).executeTransaction(<<YourTransaction>>);

関連する問題