2012-05-31 3 views
0

Я сохранил путь изображения в строке selectedImagePath. Теперь я хочу сохранить эту строку в базе данных SQL. Поэтому я создал еще один класс - ImageAdapter.Почему моя база данных SQL не может хранить строку?

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

Это мой метод onActivityResult были бы я я получить путь изображения и сохранить его в строке selectedImagePath:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == PICK_FROM_FILE) { 
      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 

      Log.v("IMAGE PATH====>>>> ",selectedImagePath); 

      // Save the image path to the database 
      long id = mImageHelper.createImage(selectedImagePath); 
      if (id > 0) { 
       id = mImageRowId; 
      } 
     } 
    } 
} 

И вот моя база данных помощник, то ImageAdapter:

public class ImageAdapter { 

// 
// Database Related Constants 
// 
private static final String DATABASE_NAME = "dataImage"; 
private static final String DATABASE_TABLE = "remindersImage"; 
private static final int DATABASE_VERSION = 4; 

public static final String KEY_IMAGE = "image"; 
public static final String KEY_ROWID = "_id"; 


private static final String TAG = "ImageAdapter"; 
private DatabaseHelper mImageHelper; 
private SQLiteDatabase mImageDb; 

/** 
* Database creation SQL statement 
*/ 
private static final String DATABASE_CREATE = 
    "create table " + DATABASE_TABLE + " (" 
      + KEY_ROWID + " integer primary key autoincrement, " 
      + KEY_IMAGE + " text not null)"; 



private final Context mImageCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
} 

/** 
* Constructor - takes the context to allow the database to be 
* opened/created 
* 
* @param ctx the Context within which to work 
*/ 
public ImageAdapter(Context ctx) { 
    this.mImageCtx = ctx; 
} 

/** 
* Open the database. If it cannot be opened, try to create a new 
* instance of the database. If it cannot be created, throw an exception to 
* signal the failure 
* 
* @return this (self reference, allowing this to be chained in an 
*   initialization call) 
* @throws SQLException if the database could be neither opened or created 
*/ 
public ImageAdapter open() throws SQLException { 
    mImageHelper = new DatabaseHelper(mImageCtx); 
    mImageDb = mImageHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mImageHelper.close(); 
} 



public long createImage(String selectedImagePath) { 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_IMAGE, selectedImagePath); 

    return mImageDb.insert(DATABASE_TABLE, null, cv); 
} 


public boolean deleteImage(long rowId) { 

    return mImageDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 


public Cursor fetchAllImages() { 

    return mImageDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_IMAGE}, null, null, null, null, null); 
} 


public Cursor fetchImage(long rowId) throws SQLException { 

    Cursor mCursor = 

      mImageDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
        KEY_IMAGE}, KEY_ROWID + "=" + rowId, null, 
        null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 


public boolean updateImage(long rowId, String image) { 
    ContentValues args = new ContentValues(); 
    args.put(KEY_IMAGE, image); 

    return mImageDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 
} 

UPDATE : Вот мой LogCat:

05-31 21:10:14.947: E/AndroidRuntime(533): FATAL EXCEPTION: main 
05-31 21:10:14.947: E/AndroidRuntime(533): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://media/external/images/media/22 }} to activity {com.xyz.android.taskreminder/com.xyz.android.taskreminder.ReminderEditActivity}: java.lang.NullPointerException 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread.deliverResults(ActivityThread.java:2980) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread.access$1100(ActivityThread.java:123) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.os.Looper.loop(Looper.java:137) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-31 21:10:14.947: E/AndroidRuntime(533): at java.lang.reflect.Method.invokeNative(Native Method) 
05-31 21:10:14.947: E/AndroidRuntime(533): at java.lang.reflect.Method.invoke(Method.java:511) 
05-31 21:10:14.947: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-31 21:10:14.947: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-31 21:10:14.947: E/AndroidRuntime(533): at dalvik.system.NativeStart.main(Native Method) 
05-31 21:10:14.947: E/AndroidRuntime(533): Caused by: java.lang.NullPointerException 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) 
05-31 21:10:14.947: E/AndroidRuntime(533): at com.xyz.android.taskreminder.ImageAdapter.createImage(ImageAdapter.java:114) 
05-31 21:10:14.947: E/AndroidRuntime(533): at com.xyz.android.taskreminder.ReminderEditActivity.onActivityResult(ReminderEditActivity.java:233) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.Activity.dispatchActivityResult(Activity.java:4649) 
05-31 21:10:14.947: E/AndroidRuntime(533): at android.app.ActivityThread.deliverResults(ActivityThread.java:2976) 
05-31 21:10:14.947: E/AndroidRuntime(533): ... 11 more 
+3

Было бы полезно, если бы вы отправили свой стек из LogCat. – jmhend

+1

Строка 'id = mImageRowId' в' onActivityResult' не имеет никакого смысла. 'id' - локальная переменная, которая вот-вот выйдет за рамки. Установка этого эффекта не оказывает. Вы хотели сохранить 'id' в' mImageRowId' вместо этого? –

+0

Вы уверены, что 'selectedImagePath' не' null', правильно? –

ответ

2

Во-первых, позволяет очистить код :)

Изменить этот

private static final String DATABASE_CREATE = 
"create table " + DATABASE_TABLE + " (" 
     + KEY_ROWID + " integer primary key autoincrement, " 
     + KEY_IMAGE + " text not null)"; 

к

private static final String DATABASE_CREATE = 
"create table if not exists " + DATABASE_TABLE + " (" 
     + KEY_ROWID + " integer primary key autoincrement, " 
     + KEY_IMAGE + " text not null)"; 

Теперь удалите приложение или четкие данные, так что любые ранее созданные базы данных получает удален. Попробуйте свое приложение и опубликуйте результаты. Пожалуйста, также разместить результат от этой линии:

Log.v("IMAGE PATH====>>>> ", selectedImagePath); 
+0

Я изменил все, что вы мне сказали, но приложение все еще падает. И я не шучу, Log.v («IMAGE PATH ==== >>>>», selectedImagePath); разве это не LogCat. – user1420042

+0

Вы уверены, что на данный момент у вас нет фильтров, за исключением подробной версии Log? Теперь я могу увидеть только одну возможную опцию, и это означает, что selectedImagePath имеет значение null. – Ole

+0

А, я нашел это: 05-31 22: 12: 42.316: V/IMAGE PATH ==== >>>> (545): /mnt/sdcard/Mercedes_SLS_AMG.jpg – user1420042

0

Вы звоните: ImageAdapter.open() перед вставкой? Если нет, то ваш mImageDb будет null, и это вызовет сбой.

+0

В моем методе onResume я назвал mImageHelper.open(). Это достаточно или мне нужно снова позвонить? – user1420042

+0

mImageHelper.open() в onResume() должно быть достаточно. Не могли бы вы разместить LogCat? – Ole

+0

Хм ..Может быть, onActivtyResult() вызывается системой до onResume()? Попробуйте mImageHelper.open() прямо перед mImageHelper.create()! – Ole

0

Edit:
Ole надлежащим образом указал, что я предположил, что вы хранили изображения, но вместо того, чтобы вы храните путьизображения, так что теперь я хотел бы предложить следуйте за ответом Оле.

Чтобы пойти на шаг дальше, почему я полагаю, что, вот следующее:
«Это, как правило, ошибка, чтобы попытаться создать новую таблицу в базе данных, которая уже содержит таблицу, индекс или вид одного и того же имени Однако, если предложение «IF NOT EXISTS» указано как часть оператора CREATE TABLE, и таблица или представление с таким же именем уже существуют, команда CREATE TABLE просто не имеет эффекта (и сообщение об ошибке не возвращается). ошибка по-прежнему возвращается, если таблица не может быть создана из-за существующего индекса, даже если указано предложение «ЕСЛИ НЕ СУЩЕСТВУЕТ». »
Источник: sqlite.org

Кроме того, я всегда рекомендую использовать try - catch блоки и logs как можно больше в устранении неполадок.

+1

Он хранит путь к изображению .. – Ole

+0

@Ole Моя ошибка, я в настоящее время работаю над приложением, которое вставляет изображения в sqlite, и, я думаю, я читал то, что хотел, и должен был быстро прыгать отвечать. Извини за это. – jnthnjns

+0

Без проблем :) Мне просто пришлось отредактировать свой ответ по той же причине. – Ole

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