23 Temmuz 2012 Pazartesi

android.database.sqlite.SQLiteMisuseException: error code 21

Merhaba,

Android tarafında karşılaştığım bir sorunu ve kısmi çözümünden bahsetmek istiyorum. Geliştirdiğim uygulamanın bir bölümünde SQLite bağlantısı yapıp veritabanına bir veri insert etmem gerekti. Bunu yaparken ilk önce SQLiteStatement kullanım parametreleri bind ederek kullanmak istedim. Bu şekilde parametreleri set edip executeInsert() metodunu çağırdığımda:
java.lang.RuntimeException: Unable to start activity ComponentInfo: android.database.sqlite.SQLiteMisuseException: error code 21: not an error
Şeklinde bir hata ile karşılaştım. Biraz araştırma yaptığımda öncelikle kaynaklarda, bu hatanın, birden çok threadin aynı anda veritabanı bağlantısı açıp kapaması esnasında olabildiğinden bahsediliyordu. Benim kodumda threadli bir yapı olmadığı gibi benzer bir kullanım da yoktu. Bu nedenle sorun bundan kaynaklı değildi. Sonrasında bir forumda başka bir arkadaş sorunun cihazın Türkçe set edilmiş Locale ayarlarından kaynaklı olabileceğini söylemişti. Bunu denemeye karar verdim. Cihazı İngilizceye çevirdiğim zaman sorun ortadan kalktı. Fakat kod tarafında bir şekilde Locale set ederek bu hatadan kurtulunmuyordu. Sonrasında kendi çözümümü ürettim. Belki bu soruna direkt olarak bir çözüm değil fakat benzer problemle karşılaşan arkadaşlar SQLiteStatement kullanmak yerine SQLiteDatabase sınıfının insert() metodunu kullanırlarsa bu sorunu çözebilirler. Tabi ki burada parametreleri artık ContentValues ile set etmek gerekecek. İlk başta belirttiğim gibi bu nedenle bu çözüm kısmi bir çözüm ama en azından hatadan kurtulabilirsiniz. 

Merak eden arkadaşlar için, hatayı aldığım cihazın gerekli bilgileri şu şekildedir:
Samsung Galaxy TabAndroid 3.2, Türkçe Locale  
( android, honeycomb, 3.2, sqlitemisuseexception, error code 21: not an error, sqlitedatabase, sqlitestatement, contentvalues )
Kaynak: http://stackoverflow.com/questions/9685633/sqlitemisuseexception-error-code-21-when-inserting-a-row