يتغير مؤشر عمود المؤشر من هاتف لآخر
-
20-12-2019 - |
سؤال
يسمح تطبيقي للمستخدم بالاتصال بآخر رقم تم الاتصال به.من خلال الضغط على زر "اتصال" مع مربع نص فارغ، سيتم الحصول على أحدث رقم صادر في قاعدة بيانات 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 من التطبيق بإنشاء جدول T مع الأعمدة
A, C
- في الإصدار 2، تريد تغيير بنية قاعدة البيانات.لذلك قمت بإضافة
B
عمود إلى البرامج النصية "إنشاء جدول".في الأجهزة الجديدة، سيحتوي هذا الجدول على أعمدةA, B, C
. - ومع ذلك، في الجزء onUpgrade()، ما عليك سوى إضافة عمود
B
(عبرALTER TABLE
)، وسوف ينتهي الهيكل كماA, C, B
.
بشكل عام، يعد استخدام فهارس الأعمدة الثابتة ("العدد الصحيح") فكرة سيئة، ما لم تحدد أيضًا الأعمدة التي تريدها (على سبيل المثال.عدم استخدام SELECT *
).استخدام getColumnIndex()
(خارج الحلقة) أكثر أمانًا.