2015-01-02 2 views
0

Я хотел бы знать (как я новичок в SQlite Database), что мне нужно сделать, чтобы сохранить данные в Sqlite. Проблема, с которой я сталкиваюсь, заключается в том, что в моем приложении пользователь может взять изображение через намерение камеры и вернуть это изображение на карту (Google Map API v2). Затем изображение отображается в полноэкранном режиме, когда пользователь нажимает на маркер. Теперь, очевидно, мне нужно сохранить эти маркеры на карте, поэтому, когда пользователь возвращается в приложение, маркеры (и соответствующие изображения) есть. Теперь я попытался сохранить изображение в базе данных как blob, но он, похоже, не работает (я не совсем уверен, почему, я могу предоставить код необходим). Но я думал, что мне нужно сохранить изображение (так как изображение уже сохранено на SDCard, как только будет сделана фотография) или просто сохраните markerId (HashMap) этого маркера, чтобы указать на соответствующее изображение, сделанное на эта точка (маркер)?Сохранение данных в базу данных SQlite

Это то, что я должен получить образ для этого маркера при постукивании по маркеру:

private Map<String, Bitmap> myMarkersHash; 
private String markerId; 

затем в onCreate Метод:

myMarkersHash = new HashMap<String, Bitmap>(); 

для при добавлении маркера:

private void drawMarker(LatLng point) { 
Marker marker = googleMap.addMarker(new MarkerOptions() 
    .position(thePoint)); 
markerId = marker.getId(); 

И затем при отображении изображения:

ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon); 
Bitmap bitmap = myMarkersHash.get(marker.getId()); 
markerIcon.setImageBitmap(bitmap); 

Любая помощь и рекомендации были бы оценены с благодарностью!

Спасибо!

EDIT

contentValues.put(LocationsDB.FIELD_IMAGE, imageData); \\Saving image 

\\Convert image to byte 
baos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 50, baos); 
imageData = baos.toByteArray(); 

\\Retrieving image 
@Override 
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { 
    int locationCount = 0; 
    double lat=0; 
    double lng=0; 
    float zoom=0; 
    locationCount = arg1.getCount(); 
    arg1.moveToFirst(); 

    if(arg1.getCount() >= 1){ 
      while(arg1.moveToNext()){ 

     // Get the latitude 
     lat = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LAT)); 
     lng = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LNG)); 
     zoom = arg1.getFloat(arg1.getColumnIndex(LocationsDB.FIELD_ZOOM)); 
     arg1.getBlob(arg1.getColumnIndex(LocationsDB.FIELD_IMAGE)); 
     thePoint = new LatLng(lat, lng); 
     drawMarker(thePoint); 
    } 

if (arg1 != null && !arg1.isClosed()){ 
    arg1.close(); 
} 


    if(locationCount>0){ 
     googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat,lng))); 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom)); 
      arg1.moveToNext(); 
      ImageView image = (ImageView) findViewById(R.id.marker_icon); 
      imageData = arg1.getBlob(arg1.getColumnIndex("blob")); 
      image.setImageBitmap(BitmapFactory.decodeByteArray(imageData, 0, imageData.length)); 

** EDIT 2 **

12-24 16:19:48.679: E/AndroidRuntime(22984): FATAL EXCEPTION: main 
12-24 16:19:48.679: E/AndroidRuntime(22984): Process: com.example.main, PID: 22984 
12-24 16:19:48.679: E/AndroidRuntime(22984): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:44) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.database.CursorWrapper.getBlob(CursorWrapper.java:122) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at com.example.main.Map.onLoadFinished(KrugerParkMap.java:341) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at com.example.main.Map.onLoadFinished(KrugerParkMap.java:1) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.Loader.deliverResult(Loader.java:104) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:73) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:223) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.os.Handler.dispatchMessage(Handler.java:102) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.os.Looper.loop(Looper.java:136) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at android.app.ActivityThread.main(ActivityThread.java:5586) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at java.lang.reflect.Method.invokeNative(Native Method) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at java.lang.reflect.Method.invoke(Method.java:515) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
12-24 16:19:48.679: E/AndroidRuntime(22984): at dalvik.system.NativeStart.main(Native Method) 

, а затем LocationsDB класс:

private static String DBNAME = "locationmarkersqlite"; 
private static int VERSION = 1; 
public static final String FIELD_ROW_ID = "_id"; 
public static final String FIELD_LAT = "lat"; 
public static final String FIELD_LNG = "lng"; 
public static final String FIELD_ZOOM = "zom"; 
public static final String FIELD_IMAGE = "blob"; 
private static final String DATABASE_TABLE = "locations"; 

private SQLiteDatabase mDB; 

public LocationsDB(Context context) { 
    super(context, DBNAME, null, VERSION); 
    this.mDB = getWritableDatabase(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String sql =  "create table " + DATABASE_TABLE + " (" + 
        FIELD_ROW_ID + " integer primary key autoincrement , " + 
        FIELD_LNG + " double , " + 
        FIELD_LAT + " double , " + 
        FIELD_ZOOM + " text , " + 
        FIELD_IMAGE + " blob " + 
        ") "; 

    db.execSQL(sql); 
} 

public long insert(ContentValues contentValues){ 
    long rowID = mDB.insert(DATABASE_TABLE, null, contentValues); 
    return rowID; 
} 

public int del(){ 
    int cnt = mDB.delete(DATABASE_TABLE, null , null); 
    return cnt; 
} 

public Cursor getAllLocations(){ 
    return mDB.query(DATABASE_TABLE, new String[] { FIELD_ROW_ID, FIELD_LAT , FIELD_LNG, FIELD_ZOOM, FIELD_IMAGE} , null, null, null, null, null, null); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 

public static Cursor rawQuery(String string, Object object) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 
+0

Не могли бы вы показать нам код, где вы запрашиваете базу данных? –

+0

Дело в том, что я еще не пробовал, но не уверен, какой из них мне нужно сэкономить (или, может быть, и того, и другого), но обновит мой вопрос кодом – wemapps

+0

@GeorgeD Обновился, спасибо – wemapps

ответ

0

Может ли это быть проблема? Вы закрыли arg1, но все еще пытаетесь получить к нему доступ. См http://developer.android.com/reference/android/database/Cursor.html#close()

if (arg1 != null && !arg1.isClosed()){ 
    arg1.close(); 
} 


    if(locationCount>0){ 
     googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat,lng))); 
      googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom)); 
      arg1.moveToNext(); 
      ImageView image = (ImageView) findViewById(R.id.marker_icon); 
      imageData = arg1.getBlob(arg1.getColumnIndex("blob")); 
      image.setImageBitmap(BitmapFactory.decodeByteArray(imageData, 0, imageData.length)); 
+0

Спасибо, но изменили его, но все равно не повезло. – wemapps

+0

@wemapps это также похоже, что вы переходите к следующему слишком много раз. Если вы замените arg1.moveToNext() на arg1.moveToLast() внизу? – Jon

0

Есть два способа сделать это, один IS-вы можете использовать библиотеку OrmLite для обработки ваших операций с базами данных. Он очень прост в использовании, с помощью этого вы можете сохранять свои данные изображения в виде массива байтов в базе данных. Просто укажите тип столбца как Byte_Array. Другой способ - использовать путь изображения в базе данных вместо сохранения данных изображения. Но вместо сохранения изображения в общедоступном каталоге вы должны сохранить свое изображение в каталоге приложения, чтобы никто не мог изменить или удалить это изображение. Надеюсь, это сработает для вас.

+0

Спасибо, Но как я могу сохранить путь к базе данных? извините за глупый вопрос, но я новичок в этом. – wemapps

+0

У вас есть путь к изображению, в котором вы его сохраняете, вам просто нужно сохранить его в базе данных в виде строки. –

Смежные вопросы