这是我第一次在 Android 环境中使用 SQLite。我试图在拍摄照片时将照片和用户的坐标插入SQLite
数据库。
昨晚(家用电脑)当我试图将照片插入数据库时,它似乎工作得很好,没有例外,虽然我找不到平板电脑在哪里创建数据库,但我尝试data
通过文件资源管理器查看文件夹在 EclipseDDMS
中,但那里什么都没有,使用我拥有的 Windows 文件资源管理器Computer\SCH-I905\Tablet\Android\data
等com.app
,但我的包不存在。
今天早上(工作电脑)我遇到了一个致命的StackOverflowError
异常。我的代码有什么问题吗?我正在将图像转换为byte[]
然后存储到数据库中,由于我阅读了一些针对s to 的建议Blob
,我使用的是byte[]
而不是将其转换为 String 。非常感谢任何帮助或建议,谢谢。byte[]
String
Blob
PS我的代码转换字符串中没有任何内容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
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);
}
日志猫:
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)