سؤال

يسمح تطبيقي للمستخدم بالاتصال بآخر رقم تم الاتصال به.من خلال الضغط على زر "اتصال" مع مربع نص فارغ، سيتم الحصول على أحدث رقم صادر في قاعدة بيانات 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() (خارج الحلقة) أكثر أمانًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top