0

Android 環境で SQLite を使用するのはこれが初めてです。SQLite写真と写真を撮ったときのユーザーの座標をDBに挿入しようとしています。

昨夜(ホーム コンピューター)に写真を DB に挿入しようとしたとき、問題なく動作したように見えました。例外はありませんでしたが、タブレットが DB を作成している場所を見つけることができませんでしdataた。ファイル エクスプローラーでフォルダーを調べてみました。 EclipseDDMSでは、そこには何もありませんでした。Windowsファイルエクスプローラーなどを使用していますComputer\SCH-I905\Tablet\Android\datacom.app、パッケージが存在しません。

今朝(Work Computer)致命的なStackOverflowError例外が発生しました。私のコードで間違っていることがありますか?? 画像を に変換してからbyte[]として DB に保存しています。を に変換する代わりにBlobを使用しています。どんな助けや推薦も大歓迎です、ありがとう。byte[]byte[]StringBlob

PS 文字列を変換するコードには何もありませんtoUpperCase()


バックグラウンド:

  • Google API 12
  • Samsung Galaxy 10.1 4G LTE タブレットでのテスト
  • 私は 2 台の異なるコンピューター (自宅と職場) で開発を行っています。現在、ファイルをサム ドライブにコピーし、ワークスペースにロードして 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

public class GlobalDBVars {
    public static final String DATABASE_NAME = "NST.db";
    public static final int DATABASE_VERSION = 2;
    public static final String TABLE_NAME = "photos_withCoordinates";

    public static final String KEY_ROWID = "_id";
    public static final String KEY_PHOTOS = "_photo";
    public static final String KEY_LAT = "_lat";
    public static final String KEY_LNG = "_lng";
}

private static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS " + 
    GlobalDBVars.TABLE_NAME + "(" + 
    GlobalDBVars.KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    GlobalDBVars.KEY_PHOTOS + " BLOB NOT NULL, " + 
    GlobalDBVars.KEY_LAT + " REAL NOT NULL, " + 
    GlobalDBVars.KEY_LNG + " REAL NOT NULL);";

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL(DATABASE_CREATE);
        onCreate(db);
        Log.i(TAG, "onCreate db: " + DATABASE_CREATE);
    } catch (SQLException e) {
        Log.e(TAG, "FAILED: " + e.getMessage());
    }
}

内にステートメントを挿入 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): [B@40751c18
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)
4

2 に答える 2

1

onCreate()再帰的に呼び出しています

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

onCreate(db)その呼び出しを削除します

于 2012-09-04T16:12:12.683 に答える
-1

リボルビング呼び出し onCreate(db)。

@Override
public void onCreate(SQLiteDatabase db) {
try {
    onCreate(db);
}
于 2014-01-07T02:56:07.673 に答える