web-dev-qa-db-fra.com

Comment vérifier si des données sont insérées dans la base de données de pièces

J'utilise Room Database à partir des nouveaux composants d'architecture de mon projet . J'ajoute des données via dao, mais lorsque j'essaie de les récupérer, je ne les reçois pas. Pouvez-vous s'il vous plaît me suggérer comment vérifier si l'insertion a réussi ou non? Vous trouverez ci-dessous les codes pour vous aider à comprendre le problème.

en ajoutant à la base de données, j'ai vérifié avec le débogueur, cette instruction a été exécutée avec succès.

appContext.db.rallyDAO().addVehicleListItem(vehicle)

Obtenir null de la base de données sur cette instruction après insertion.

val v = appContext.db.rallyDAO().getVehicleListItem(it.vehicleID)

RoomDatabase

@Database(entities = arrayOf(Rally::class, Route::class, CheckPoints::class, Vehicles::class, VehicleListItem::class), version = 1)
abstract class TSDRoom: RoomDatabase() {
    public abstract fun rallyDAO():RallyDAO
}

À l'intérieur de DAO

@Insert(onConflict = OnConflictStrategy.REPLACE)
    fun addVehicleListItem(vehicleListItem:VehicleListItem)

    @Query("select * from vehicles_submitted where vehicle_id LIKE :vehicleID")
    fun getVehicleListItem(vehicleID:String):VehicleListItem

VehicleListItem Entity

@Entity(tableName = "vehicles_submitted",
        foreignKeys = arrayOf(ForeignKey(entity = Rally::class,
                parentColumns = arrayOf("rally_id"),
                childColumns = arrayOf("rally_id"))))
class VehicleListItem {
    @PrimaryKey
    @ColumnInfo(name = "vehicle_id")
    @SerializedName("vehicle_id")
    var vehicleID : String = ""
    @ColumnInfo(name = "driver_id")
    @SerializedName("driver_id")
    var driverID : String = ""
    @ColumnInfo(name = "vehicle_name")
    @SerializedName("vehicle_name")
    var vehicleName : String = ""
    @ColumnInfo(name = "driver_name")
    @SerializedName("driver_name")
    var driverName : String = ""
    @ColumnInfo(name = "driver_email")
    @SerializedName("driver_email")
    var driverEmail : String = ""

    @ColumnInfo(name = "rally_id")
    @SerializedName("rally_id")
    var rallyID: String = ""

    @ColumnInfo(name = "is_passed")
    @SerializedName("is_passed")
    var isPassed = false

    @ColumnInfo(name = "passing_time")
    @SerializedName("passing_time")
    var passingTime:String=""
}
6
Rivu Chakraborty

Le problème était dans le thread . Room ne vous permet pas d'exécuter des requêtes de base de données dans le thread principal. L'appel pour insérer la méthode se trouvait à l'intérieur d'un bloc try-catch et j'ignorais l'exception . Je l'ai corrigée et voici comment elle se lit maintenant.

doAsync {
                        val addedID = appContext.db.rallyDAO().addVehicleListItem(vehicle)
                        Logger.d("vehicle_lsit_item","Inserted ID $addedID")
        }

De plus, j’ai examiné la documentation , la méthode d’insertion peut renvoyer un long (ou une liste de longs si la liste est passée à insérer). J'ai aussi changé la signature de l'insert, et voici le code modifié

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addVehicleListItem(vehicleListItem:VehicleListItem):Long

P.S. J'utilise anko for doAsync

4
Rivu Chakraborty

Vous pouvez utiliser Stetho pour voir votre fichier de préférences de base de données et partagé dans l'outil de développement chrome.

http://facebook.github.io/stetho/

5
Ege Kuzubasioglu

Vous pouvez tester cela de plusieurs façons.

  1. Comme @Ege Kuzubasioglu l’a mentionné, vous pouvez utiliser stetho pour vérifier manuellement (modification mineure du code).
  2. Extrayez le fichier de base de données "data/data/yourpackage/database/yourdatabase.db" sur votre ordinateur local et utilisez toutes les applications pour lire le contenu de la base de données. Personnellement, j'utilise https://sqlitebrowser.org/ ..__/. L'extraction du fichier de base de données peut être effectuée à l'aide des commandes Shell ou en utilisant "Device File Explorer" à partir du studio Android.

  3. Ecrivez TestCase pour voir s'il fonctionne. Voici un exemple de cas de test d'un de mes projets.

    // Code de ma classe DAO

    @Insert (onConflict = OnConflictStrategy.REPLACE) public abstract Long [] insertPurchaseHistory (List MusicOrders);

// Mon cas de test @Tester public void insertPurchaseHistoryTest () {

    // Read test data from "api-responses/music-purchase-history-response.json"
    InputStream inputStream = getClass().getClassLoader()
            .getResourceAsStream("api-responses/music-purchase-history-response.json");
    // Write utility method to convert your stream to a string.
    String testData = FileManager.readFileFromStream(inputStream);

    // Convert test data to "musicOrdersResponse"
    MusicOrdersResponse musicOrdersResponse = new Gson().fromJson(testData,MusicOrdersResponse.class);

    // Insert inmateMusicOrders and get the list of
    Long[] rowsInserted = tracksDao.insertPurchaseHistory(musicOrdersResponse.getmusicOrders());
    assertThat(rowsInserted.length,Matchers.greaterThan(0));
}
3
Prakash

Une option que vous pouvez envisager, si vous n’avez pas de problèmes d’autorisation d’accès, consiste à naviguer directement dans votre instance SQLite du périphérique et à interroger les tables directement à cet emplacement.

Si vous utilisez l'émulateur intégré à Android Studio ou à un téléphone enraciné, vous pouvez effectuer les opérations suivantes:

adb root
adb remount
cd data/data/path/of/your/application/database
sqlite3 mydb.db

Ensuite, vous pouvez interroger vos tables

3
Fabio

Vous pouvez utiliser Android Debug Database pour accéder aux bases de données de votre application via un navigateur Web. Android Debug Database expose les bases de données via un serveur Web intégré.

Utilisez-le comme suit:

  1. Incluez-le en tant que dépendance debugImplementation dans le build.gradle de votre application afin qu'il ne soit inclus que dans la version de débogage et non dans la version de la version:

    debugImplementation 'com.amitshekhar.Android:debug-db:1.0.3'
    
  2. Démarrer la version de débogage de votre application

  3. Le serveur Web intégré se lance automatiquement et annonce son adresse et son port dans les journaux:

    D/DebugDB: Open http://XXX.XXX.X.XXX:8080 in your browser
    
  4. Si vous exécutez l'application via USB, configurez le transfert de port:

    adb forward tcp:8080 tcp:8080
    

    Si vous n'exécutez pas l'application via USB, votre téléphone et votre poste de travail Android doivent appartenir au même réseau et votre poste de travail doit pouvoir envoyer une requête ping au téléphone Android.

  5. Enfin, ouvrez le lien à partir des journaux du navigateur.

Notez que cela fonctionne parfaitement sans enraciner le périphérique car le serveur Web s'exécute dans le contexte de votre application.

2
mrts