2013-09-02 8 views
6

Ich habe zwei Entitäten, User und Store. User hat viele Stores (1: M) Beziehung. Ich habe einige Speicherliste in die Geschäftstabelle eingefügt, indem ich Code folge.DaoException: Die Entität ist vom DAO-Kontext getrennt

public void saveStoresToDatabase(Context context, ArrayList<Store> storeList) { 

    DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "notes-db", null); 
    SQLiteDatabase db = helper.getWritableDatabase(); 
    DaoMaster daoMaster = new DaoMaster(db); 

    DaoSession daoSession = daoMaster.newSession(); 
    StoreDao storeDao = daoSession.getStoreDao(); 

    ArrayList <Store> list = SharedData.getInstance().getUser().getStoreList(); 

    for(int i = 0; i < storeList.size(); i++) { 
     storeList.get(i).setUserIdForStore(SharedData.getInstance().getUser().getId()); 
    } 
    storeDao.insertOrReplaceInTx(storeList); 
    list.addAll(storeList); 
    user.resetStoreList(); 

} 

Ich erhalte Ausnahme „Einheit von DAO Kontext gelöst wird“, wenn ich user.getStoreList() versuchen zu nennen. Die Ausnahme tritt bei dem folgenden Code auf, der ausgeschlossen wird, da die daoSessionnull ist.

public ArrayList<Store> getDMStoreListFromDatabase(Context context) { 
    return SharedData.getInstance().getUser().getStoreList(); 
} 

wo SharedData meine Singleton ist, ein Benutzerobjekt mit:

private SharedData() { 
    user = new User(); 
} 

und ich erhalte die sharedData Instanz wie folgt:

public static synchronized SharedData getInstance() { 
    if (sharedObject == null) { 
     sharedObject = new SharedData(); 
    } 
    return sharedObject; 
} 
+0

Bitte geben Sie einen Code darüber, wo Sie das Benutzerobjekt erhalten und wo Sie user.getStoreList() aufrufen. Sind Sie sicher, dass die storeList korrekt in Ihre db eingefügt wurde? Sind Sie sicher, dass für den ausgewählten Benutzer eine StoreList in der Datenbank vorhanden ist? – AlexS

+0

Ich habe meine Frage bearbeitet, indem ich etwas Code eingefügt habe, ja, ich bin sicher, dass die storeList eingefügt wird, obwohl ich in die Transaktion einfüge, aber ich habe es auch überprüft, indem ich die Listenelemente nacheinander eingefügt habe. Es gibt nur einen Benutzer, also bin ich sicher, dass die storeList für den ausgewählten Benutzer in der Datenbank ist, da sie erfolgreich eingefügt wurde. Gibt es eine Möglichkeit, die Datenbanktabellen anzuzeigen? –

Antwort

9

Objekte darstellen, Datenbankeinträge (wie User) sind nur an eine Datenbanksitzung angehängt, wenn sie zuvor aus der Datenbank geholt oder in die Datenbank eingefügt wurden.

Es sieht so aus, als ob Sie Ihr Benutzerobjekt nicht mit greundao laden, sondern es einfach mit new erstellen.

Sie scheinen dieses Benutzerobjekt auch nicht mit dem Dao zu speichern. Daher ist das Benutzerobjekt nicht an die Sitzung gebunden.

Darüber hinaus legen Sie nur die Benutzer-ID in jedem Geschäft. Wenn Sie das Benutzer-Objekt nicht an einer anderen Stelle eingefügt haben, kann dies ebenfalls einen Fehler verursachen, da die Fremdschlüssel-Einschränkung möglicherweise nicht mehr funktioniert (je nachdem, wie green- dao dies intern behandelt).

Versuchen Sie, die Benutzer-Objekt in die Läden mit setUser() statt setUserIdForStore() hinzuzufügen.

Wenn dies nicht funktioniert, versuchen Sie, das Benutzerobjekt zunächst mit einer zu speichern oder zu laden.

+0

Der Vorschlag "Benutzerobjekt zuerst mit UserDao speichern/laden" funktionierte. Über das Setzen der "setUserIdForStore()", ich habe so getan, um die ID für jeden Speicher, den ich in db einfügen werde Server, möglicherweise Liste der gleichen speichert, die bereits in die Datenbank eingefügt werden, so ersetzen ich den userIdForStore Schlüssel für die heruntergeladene storesList mit der eingeloggten userId, um insertOrReplace erfolgreich zu machen, jedoch werden jedes Mal doppelte Datensätze eingefügt, wenn die storeList abgerufen und in db eingefügt wird. Können Sie die mögliche Ursache angeben? –

+0

Ich verstehe Ihre Bedürfnisse nicht genau. Ein Benutzer hat viele Geschäfte und ein Geschäft gehört einem Benutzer, richtig? Wenn Sie einem bestimmten Benutzer einen Speicher hinzufügen möchten, versuchen Sie, den Benutzer mit dem gesamten Benutzerobjekt und nicht nur mit der ID festzulegen. Sie verwenden ein ORM-Framework, versuchen Sie also nicht, sich mit id herumzuärgern, sondern nutzen Sie die Objekte. Sonst können seltsame Verhaltensweisen auftreten. – AlexS