2012-09-04 30 views
0

這是我第一次在Android環境中使用SQLite。我試圖在照片拍攝時將照片和用戶的座標插入到SQLite DB中。將照片和座標插入SQLite數據庫時出現StackOverflowError

它似乎昨晚工作得很好(家用電腦)當我試圖插入到數據庫的照片,沒有例外,雖然我無法找到平板電腦創建數據庫的位置,我試着看data文件夾通過Eclipse DDMS中的文件資源管理器,但沒有任何內容,使用Windows文件資源管理器我有Computer\SCH-I905\Tablet\Android\datacom.app等,但我的包不存在。

今天早上(工作計算機)我得到致命StackOverflowError異常。有沒有我做錯了我的代碼?我將圖像轉換爲byte[],然後作爲Blob存儲到數據庫,我使用的是byte[],而不是將byte[]轉換爲字符串,這是由於我對String s至Blob讀取的一些建議。任何幫助或建議是非常感謝,謝謝。

P.S.我沒有在我的代碼轉換的任何字符串toUpperCase()


背景:

  • 谷歌API的12
  • 測試的三星Galaxy 10.1 4G LTE平板
  • 我在兩臺不同的計算機(家庭和工作)上開發,目前我將文件複製到拇指驅動器,然後將它們加載到我的工作區並啓動Eclipse。由於簽名衝突,我必須卸載應用程序,然後通過Eclipse重新運行應用程序。

在這裏,我將圖像轉換爲byte[]然後張貼到數據庫:

public Camera.PictureCallback jpegHandler = new Camera.PictureCallback(){ 

    public void onPictureTaken(byte[] jpeg, Camera camera){ 
     // TODO Work on the image insertion into the database 

     try { 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      image = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length); 
      image.compress(Bitmap.CompressFormat.PNG, 100, bos); 
      byte[] imageBlob = bos.toByteArray(); 

      UpdateGeoLocation updateGeo = new UpdateGeoLocation(getApplicationContext()); 

      double picLat = updateGeo.returnlocation.getLatitude(); 
      double picLng = updateGeo.returnlocation.getLongitude(); 

      Log.i("imageBlob", "" + imageBlob); 
      Log.i("phoLat", "" + picLat); 
      Log.i("phoLng", "" + picLng); 

      dbControl.open(); 
      dbControl.addItem(imageBlob, picLat, picLng); 
      dbControl.close(); 

      Log.i("InsertPhotoIntoDB", "WORKED!"); 
     } catch (SQLiteException e) { 
      Log.e("InsertPhotoIntoDB", "FAILED: " + e.getMessage()); 
     } 

這裏是我的DatabaseHelper.Java

片段

插入語句中DatabaseControl.Java

public long addItem(byte[] photos, double _lat, double _lng) { 
    ContentValues setUpVals = createContentValues(photos, _lat, _lng); 

    return database.insert(GlobalDBVars.TABLE_NAME, null, setUpVals); 
} 

logcat的:

09-04 10:08:48.160: I/imageBlob(21529): [[email protected] 
09-04 10:08:48.160: I/phoLat(21529): 37.3674153 
09-04 10:08:48.160: I/phoLng(21529): -77.4001403 
09-04 10:08:48.240: I/dalvikvm(21529): threadid=1: stack overflow on call to Ljava/util/Locale;.getLanguage:L 
09-04 10:08:48.240: I/dalvikvm(21529): method requires 8+20+0=28 bytes, fp is 0x58f53318 (24 left) 
09-04 10:08:48.240: I/dalvikvm(21529): expanding stack end (0x58f53300 to 0x58f53000) 
09-04 10:08:48.240: I/dalvikvm(21529): Shrank stack (to 0x58f53300, curFrame is 0x58f56d8c) 
09-04 10:08:48.240: D/AndroidRuntime(21529): Shutting down VM 
09-04 10:08:48.240: W/dalvikvm(21529): threadid=1: thread exiting with uncaught exception (group=0x40105760) 
09-04 10:08:48.270: D/dalvikvm(21529): GC_CONCURRENT freed 95K, 8% free 8606K/9287K, paused 2ms+2ms 
09-04 10:08:48.310: E/AndroidRuntime(21529): FATAL EXCEPTION: main 
09-04 10:08:48.310: E/AndroidRuntime(21529): java.lang.StackOverflowError 
09-04 10:08:48.310: E/AndroidRuntime(21529): at java.lang.CaseMapper.toUpperCase(CaseMapper.java:143) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at java.lang.String.toUpperCase(String.java:1619) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at android.database.DatabaseUtils.getSqlStatementType(DatabaseUtils.java:1245) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:100) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:59) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1931) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1864) 
09-04 10:08:48.310: E/AndroidRuntime(21529): at sompackage.nst.DatabaseHelper.onCreate(DatabaseHelper.java:49) 

回答

1

你打電話onCreate()遞歸

@Override 
public void onCreate(SQLiteDatabase db) { 
    try { 
     db.execSQL(DATABASE_CREATE); 
     **onCreate(db);** 
... 
} 

刪除onCreate(db)呼叫

+0

唉,這麼折騰,它始終是這些小東西。謝謝!該行假設在我的'onUpgrade()'中,並且我把它放在了錯誤的方法中。照顧和工作。再次感謝。我會盡快接受。 – jnthnjns

-1

週轉調用的onCreate(DB)。

@Override 
public void onCreate(SQLiteDatabase db) { 
try { 
    onCreate(db); 
} 
+0

這個答案是錯誤的,除非你可以提供它的參考。 – verybadalloc