2016-04-11 12 views
7

Projemizde, hizmetlerden alınan verileri saklamak için veri modelleri kullanıyoruz. Bu nedenle, veri tabanına veri eklediğimizde, tüm alan adlarını almak için objModelClass.getClass(). GetDeclaredFields() yöntemini kullanırız ve bu, sınıfın tüm alan adlarını doğru bir şekilde döndürmekle kalmaz, aynı zamanda bir ek alan döndürür. Sınıfta mevcut olmayan "$ change" adıyla.

Garip olan şey, android stüdyosunda böyle bir sorun yoktu ama biz android stüdyo 2.0'a geçtiğimizde bu oldu.

Hızlı bir düzeltme uygulamam da, ancak bunu düzeltmem gerekiyor. Niçin olduğunu bilmek istiyorum?

Bu bu yöntemi

public void insertValuesIntoTable(final String strTableName, ArrayList<Object> alObjClasses, 
             String strPrimaryKey, String strCompositeKey) { 
     try { 
      SQLiteDatabase db_w = this.getWritableDatabase(); 
      ContentValues contentValues = new ContentValues(); 
      //Iterate through every model class Object in the ArrayList and transfer the contents to the DB 
      if (alObjClasses != null) 
       for (Object objModelClass : alObjClasses) { 
        for (Field field : objModelClass.getClass().getDeclaredFields()) { 
         //Encrypt value if encryption is enabled & the column is to be encrypted 
         try { 
          field.setAccessible(true); 
          //Test if the table received is Ignore contacts. Minor Hack inserted 
          //So that the same contact data model can be re used. It checks if the 
          //Table is of ignored constant or not then checks if the column exists 
          //in the table or not as that of the field name. Doing this saves 
          //from receiving a SQLConstraint exception stating, "Column not found" 
          if(field.getName().equals("$change")) 
           continue; 
          if(strTableName.equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS)) 
           if(!field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_NAMES) 
             && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_NUMBERS) 
             && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_EMAIL) 
             && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_CITY) 
             && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_ID)) 
            continue; 
          contentValues.put(field.getName(), 
            (Constants.ENCRYPTION_PREFERENCE && HelperFunctions.isColumnEncrypted(field.getName())) 
              ? HelperFunctions.encryptString((String) field.get(objModelClass)) 
              : (String) field.get(objModelClass)); 
         } catch (IllegalAccessException e) { 
         // e.printStackTrace(); 
          //Never thrown since field.setAccessible(true); is called before accessing data 
         } 
         catch (ClassCastException e) { 
        //   e.printStackTrace(); 
          //Never thrown since field.setAccessible(true); is called before accessing data 
         } 
        } 
        try { 
         if (db_w.insert(strTableName, null, contentValues) == -1) 
          throw new SQLiteConstraintException(); 
        } catch (SQLiteConstraintException e) { 
         // e.printStackTrace(); 
         Log.i("Error - DB", "Error occurred while trying to add data to " 
           + strTableName + " Table, updating data instead."); 
         //Since the entry exists in the DB, it will be updated instead 
         updateEntryInDatabase(db_w, strTableName, strPrimaryKey, strCompositeKey, contentValues); 
        } 
       } 
      db_w.close(); 
     } catch (NullPointerException e) { 
     // e.printStackTrace(); 
      //Is thrown sometimes when the context of the activity which called it is destroyed mid execution 
     } 
     catch (SQLiteException e) { 
     // e.printStackTrace(); 
      //Is thrown sometimes when the context of the activity which called it is destroyed mid execution 
     } 
    } 
+0

sorunum uzun alanlar [tarafından döndürülen gördüğünüzde 0'dan madde "$ değişikliği" ve 48 de öğe "serialversionuid" ..... edilir olmasıdır 48] .getLong (boş). foo [47] .getlong = 2131099695 foo [48] .getlong = 0 foo [49] .getlong = 2131099696 çok bu neden olabilir ne Stumped. – Zypps987

+0

, daha fazla açıklık için bazı kodları gönderebilir? Bu arada probleminiz benimkiyle aynıysa, aşağıda verilen çözümleri kontrol edin. –

cevap

10

Sabahtan beri bu konuyla mücadele ediyorum kullanarak fonksiyonu. Android Studio 2'nin yeni işlevinden kaynaklanmaktadır. Anında çalıştırma, bu alanı bir yere ekler, çünkü hata ayıklama sırasında görülebilir: arayüz com.android.tools.fd.runtime.IncrementalChange'u uygular.

Bu sorun

isSynthetic() yöntemi kullanılarak alanını kontrol ederek çözülebilir: aksi $change gibi çalışma zamanı tarafından oluşturulan alanlar için true ve false dönecektir.

+1

İlgili Android hatası burada: https://code.google.com/p/android/issues/detail?id=204714 - "$ change" alanı, Android Studio 2.1'de büyük olasılıkla bu sorunların çoğunu çözecek. Şu anda üretebilir. –

+0

@miles sorunu aynı zamanda Android studio 1.8'in (önlediğim kadarıyla) önizleme kanalında da mevcuttu ve çözümün işe yarayıp yaramadığını kontrol etmeme rağmen anında çalışma veya hotswapping özelliği yoktu. teşekkürler –

+0

@Kernald yea, gelecekte sürümde çözüleceğine inanıyorum, ancak o zamana kadar gelecekteki sürümlerde de bozulmayacak bir düzeltmeye sahip olmanız gerekiyor. –

1

Neden olduğunu öğrenmek istiyorum?

zaten öncesinde 2,0 Android Studio'da oluşturulan Projeniz böylece 2,0

düzgün bu

düzeltmek gerekir Android Studio'da tanıtılan Anlık koşmak kullanmaya hazır değil Sorunu aşağıdakileri kullanarak çözebilirsiniz: Çalıştır> Temizle ve Yeniden Çalıştır, kaynak: https://developer.android.com/studio/run/index.html#rerun

veya by:

  1. devre dışı bırak Anlık çalıştırma: Dosya> Ayarlar> kurmak, Yürütme, Dağıtım> Anında Çalıştır ve işaretini etkinleştirme
  2. projeyi çalıştırmak Anında Çalıştır
  3. Anında Çalıştır etkinleştirme: Dosya> Ayarlar> kurmak, Yürütme, Dağıtım > Anında çalıştırın ve Anında Çalıştır etkinleştirme kontrol
İlgili konular