カーソル列インデックスは電話から電話に変わります
-
20-12-2019 - |
質問
マイアプリケーションを使用すると、ユーザーが呼び出された最新の番号を呼び出すことができます。空のテキストボックスで "Call"ボタンを押すことによって、それは私のORMデータベースの最新の発信番号をつかみます。しかし、問題はいくつかの電話だけで発生します。
データを引っ張ったとき、次のコードを使ってそうします。
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
.
c
カーソルをデバッグするときは、これらの値をこれらの列に与えます。
[recentNumberType, recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, _id]
Name:anthony
Num:(111) 111-1111
NumType:Mobile
CallType:Outgoing
.
別の電話でc
カーソルを取得したとき
[recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, recentNumberType, _id]
Name:(111) 111-1111
Num:Mobile
NumType:FREE
CallType:1867
.
だから私がインデックスでデータを試して私のデータを引っ張ると、さまざまな値が得られます。なぜこれが起こるのですか?両方の電話はNexus 5と4.4.2です。
これに関する洞察は素晴らしいでしょう。ありがとう!
解決
列は「変更」できます。たとえば、この場合を検討してください。
- アプリのバージョン1は、列
A, C
でTテーブルを作成します。
- バージョン2では、データベースの構造を変更します。そのため、[Create Table]スクリプトに
B
列を追加します。新しいデバイスでは、このテーブルには列A, B, C
があります。 - ただし、onupgrade()部分では、(
B
を介して)列ALTER TABLE
を追加し、構造体はA, C, B
として終了します。
一般に、必要な列(SELECT *
を使用しない)を指定しない限り、固定(「整数」)列インデックスを使用することは悪い考えです。getColumnIndex()
(ループ外)の使用はより安全です。
所属していません StackOverflow