Frage

Meine Anwendung ermöglicht es einem Benutzer, die zuletzt angerufene Nummer anzurufen.Durch Klicken auf die Schaltfläche „Anrufen“ mit einem leeren Textfeld wird die neueste ausgehende Nummer in meiner ORM-Datenbank abgerufen.Das Problem tritt jedoch nur bei einigen Telefonen auf.

Wenn ich meine Daten abrufe, tue ich das mit dem folgenden Code:

Dao<RecentCallsInfo, Integer> dao = null;
if (getActivity() instanceof MainActivity) {
    MainActivity main = (MainActivity) getActivity();
    dao = main.getDatabaseHelper().getRecentDataDao();
}

QueryBuilder<RecentCallsInfo, Integer> qb = dao.queryBuilder();
qb.orderBy(RecentCallsInfo.RECENT_COLUMN_ID, false);
qb.where().eq(RecentCallsInfo.RECENT_COLUMN_CALL_TYPE, "Outgoing");

// when you are done, prepare your query and build an iterator
CloseableIterator<RecentCallsInfo> iterator = dao.iterator(qb.prepare());

// get the raw results which can be cast under Android
AndroidDatabaseResults results = (AndroidDatabaseResults)iterator.getRawResults();
Cursor c = results.getRawCursor();

if(c.moveToFirst()){
    if(!c.getString(RecentQuery.COLUMN_NUM).isEmpty()){
        System.out.println("Recent Record: \n Name:" + c.getString(RecentQuery.COLUMN_NAME) + 
        "\nNum:" + c.getString(RecentQuery.COLUMN_NUM) + "\nNumType:" + c.getString(RecentQuery.COLUMN_NUM_TYPE)+ 
        "\nCallType:" + c.getString(RecentQuery.COLUMN_CALL_TYPE));

        etcalle.setText(c.getString(RecentQuery.COLUMN_NUM));
     }
 }

 //RecentQuery.COLUMN_NAME = 5
 //RecentQuery.COLUMN_NUM = 6
 //RecentQuery.COLUMN_NUM_TYPE = 0
 //RecentQuery.COLUMN_CALL_TYPE = 2

Wenn ich meine debugge c Cursor, er gibt mir diese Spalten mit diesen Werten

[recentNumberType, recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, _id]

Name:anthony
Num:(111) 111-1111
NumType:Mobile
CallType:Outgoing

Wenn ich meine bekomme c Cursor auf einem anderen Telefon, das ich bekomme

[recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, recentNumberType, _id]

Name:(111) 111-1111
Num:Mobile
NumType:FREE
CallType:1867

Wenn ich also versuche, meine Daten nach Index abzurufen, erhalte ich unterschiedliche Werte.Warum passiert das?Beide Telefone sind Nexus 5 und auf 4.4.2.

Jeder Einblick dazu wäre großartig.Danke!

War es hilfreich?

Lösung

Spalten können sich „verändern“.Betrachten Sie zum Beispiel diesen Fall.

  • Version 1 einer App erstellt die T-Tabelle mit Spalten A, C
  • In Version 2 möchten Sie die Struktur der Datenbank ändern.Also fügst du das hinzu B Spalte zu Ihren „Tabelle erstellen“-Skripten hinzufügen.Bei neuen Geräten wird diese Tabelle Spalten haben A, B, C.
  • Im onUpgrade()-Teil fügen Sie jedoch einfach eine Spalte hinzu B (über ALTER TABLE), und die Struktur wird enden als A, C, B.

Im Allgemeinen ist es eine schlechte Idee, feste („ganzzahlige“) Spaltenindizes zu verwenden, es sei denn, Sie geben auch an, welche Spalten Sie möchten (d. h.nicht verwenden SELECT *).Benutzen getColumnIndex() (außerhalb der Schleife) ist sicherer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top