Der Index der Cursorspalte ändert sich von Telefon zu Telefon
-
20-12-2019 - |
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!
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 habenA, B, C
. - Im onUpgrade()-Teil fügen Sie jedoch einfach eine Spalte hinzu
B
(überALTER TABLE
), und die Struktur wird enden alsA, 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.