2017-07-28 2 views
0

J'essaye de configurer Room comme un moyen de simplifier l'accès à la base de données SQLite. J'ai écrit un code, mais je ne peux pas courir, comme l'application émet une exception suivante:Room - quand initialiser la base de données et comment y accéder à travers le cycle de vie de l'application

Impossible d'accéder à la base de données sur le thread principal car il peut potentiellement bloquer l'interface utilisateur pendant une longue période de temps

J'ai fait quelques recherches et ce que j'ai trouvé est .allowMainThreadQueries() dans databaseBuilder qui me semble comme la solution terrible, parce que c'est comme le message d'erreur d'inhibition, ne fixant pas la vraie cause.

Alors, quelles sont les meilleures pratiques? Quand (dans le cycle de vie de l'application) devrais-je créer ma base de données et où dois-je la stocker afin que je puisse y accéder à partir de n'importe quelle activité que je veux?

Répondre

1

Lorsque (dans le cycle de vie de l'application) Dois-je créer ma base de données

Lazy-créer votre RoomDatabase lors du premier accès, comme vous le feriez lors de l'utilisation SQLiteOpenHelper directement.

où dois-je le stocker

Un singleton sera un modèle typique, comme vous le feriez lors de l'utilisation SQLiteOpenHelper directement.

Aucune de ces questions n'a de lien avec le message d'erreur. C'est une question d'accès à la base de données sur un thread d'arrière-plan, tout comme vous le feriez si vous utilisiez SQLiteOpenHelper directement. Pour les méthodes @Query, vous pouvez demander à la méthode de renvoyer un LiveData ou un type RxJava (par exemple, Flowable), auquel cas Room prendra en charge le travail sur un thread d'arrière-plan. Pour les autres opérations (par exemple, @Insert), vous êtes responsable de l'invocation de ces méthodes sur un fil d'arrière-plan vous-même (Thread, AsyncTask, ThreadPoolExecutor, IntentService, JobIntentService, etc.).