2016-06-20 10 views
-3
アンドロイド

でNullPointerExceptionエラーを与えるが、私ははSQLiteは私がアンドロイドアプリで他の情報と一緒に画像を保存するためのsqliteのDBを使用しようとしています

ここ
06-20 12:00:51.411 4132-4132/braindottech.com.fishid E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: braindottech.com.fishid, PID: 4132 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 
     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 
     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
     at braindottech.com.fishid.PhotoDBMS.<init>(PhotoDBMS.java:65) 
     at braindottech.com.fishid.CameraScan$6.onClick(UseSqliteDB.java:23) 
     at android.view.View.performClick(View.java:5204) 
     at android.view.View$PerformClick.run(View.java:21153) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

は私の「UseSqliteDB.java」のコードでこのエラーを取得しています:

public class UseSqliteDB extends Fragment { 

    private Button saveResult; 

    public UseSqliteDB(){} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.fragment_camera, container, false); 

     context = this.getActivity(); 
     saveResult = (Button) v.findViewById(R.id.button_save_CameraPreview); 

     saveResult.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 

      try { 
       PhotoDBMS photoDBMS = new PhotoDBMS(getActivity()); 
       String nameImage = "IMAGE"; 
       Calendar calendar = Calendar.getInstance(); 
       nameImage += calendar.get(Calendar.DATE) + calendar.get(Calendar.HOUR) + calendar.get(Calendar.MINUTE) + 
         calendar.get(Calendar.SECOND) + calendar.get(Calendar.MILLISECOND); 
       Boolean response = photoDBMS.insertData(nameImage, resultTV.getText().toString(), finalBitmap); 
       if (!response) { 
        Toast.makeText(context, "Database entry failed!", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(context, "Database entry successful!", Toast.LENGTH_LONG).show(); 
       } 

      }catch(Exception e){ 
       Log.d("HIP","E = "+e); 
      } 

     } 
     }); 

     return v; 
    } 

} 

PhotoDBMS.java

public class PhotoDBMS { 

    private Context context; 

    public PhotoDBMS(Context c){ 
     context = c; 
    } 

    public static abstract class DBMS_Constants implements BaseColumns { 
     public static final String TABLE_NAME = "MY_COLLECTION"; 
     public static final String COLUMN_NAME_NAME = "Name"; 
     public static final String COLUMN_NAME_INFO = "Info"; 
     public static final String COLUMN_NAME_IMAGE = "Image"; 
    } 

    private static final String TEXT_TYPE = " TEXT"; 
    private static final String COMMA_SEP = ","; 
    private static final String BLOB = "BLOB"; 
    private static final String SQL_CREATE_TABLE = "CREATE TABLE " + DBMS_Constants.TABLE_NAME + " (" + 
     DBMS_Constants._ID + " INTEGER PRIMARY KEY," + 
     DBMS_Constants.COLUMN_NAME_NAME + TEXT_TYPE + COMMA_SEP + 
     DBMS_Constants.COLUMN_NAME_INFO + TEXT_TYPE + COMMA_SEP + 
     DBMS_Constants.COLUMN_NAME_IMAGE + BLOB + ")"; 

    private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + DBMS_Constants.TABLE_NAME; 

    public class DbHelper extends SQLiteOpenHelper { 
    // If you change the database schema, you must increment the database version. 
     public static final int DATABASE_VERSION = 1; 
     public static final String DATABASE_NAME = "FeedReader.db"; 

     public DbHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(SQL_CREATE_TABLE); 
     } 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
      db.execSQL(SQL_DELETE_ENTRIES); 
      onCreate(db); 
     } 

     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      onUpgrade(db, oldVersion, newVersion); 
     } 

    } 

    DbHelper dbHelper = new DbHelper(context); 
    SQLiteDatabase collectionDB = dbHelper.getWritableDatabase(); 

    public boolean insertData(String name, String info, Bitmap bm){ 

     bitmapUtility utility = new bitmapUtility(); 
     byte[] image = utility.getBytes(bm); 
     ContentValues cv = new ContentValues(); 
     cv.put(DBMS_Constants.COLUMN_NAME_NAME, name); 
     cv.put(DBMS_Constants.COLUMN_NAME_INFO, info); 
     cv.put(DBMS_Constants.COLUMN_NAME_IMAGE, image); 
     return collectionDB.insert(DBMS_Constants.TABLE_NAME, null, cv) > 0; 

    } 

    public boolean deleteData(String name){ 
     return collectionDB.delete(DBMS_Constants.TABLE_NAME, DBMS_Constants.COLUMN_NAME_NAME + " = " + name, null) > 0; 
    } 

} 

私は内側のtry-catch節でこのエラーを取得していますUseSqliteDB.java。このエラーを解決するのを手伝ってください。事前に感謝!クラスレベルでの代わりに、任意の方法内側添加

DbHelper dbHelper = new DbHelper(context); 
SQLiteDatabase collectionDB = dbHelper.getWritableDatabase(); 

行:

+0

してPhotoDBMSクラスを交換してくださいあなたは例外の完全なスタックトレースを提供することができますか? '; onActivityCreated''に 'と' PhotoDBMSのphotoDBMS =新しいPhotoDBMS(文脈)のように、そのコンテキストを渡す;)あなたの 'コンテキスト= this.getActivityを(移動 – SripadRaj

+0

。不要な場合は、 'PhotoDBMS'クラスから' dbHelper.getWritableDatabase(); 'を削除してください。 –

+0

@SripadRajはイエス(あなたがやったように申し訳ありません私は自分の名前を書くことはできません)K @prosper logcat – Algor7

答えて

2

問題によるものです。

どちらのメソッドを作成し、データベースオブジェクトを作成し、取得するためにphotoDBMSを使用してそれを呼び出す:

public void createDB(){ 
    DbHelper dbHelper = new DbHelper(context); 
    SQLiteDatabase collectionDB = dbHelper.getWritableDatabase(); 
} 

とボタンでのonClickメソッドは、それを呼び出す:

PhotoDBMS photoDBMS = new PhotoDBMS(getActivity()); 
photoDBMS.createDB(); 

OR PhotoDBMSクラスのコンストラクタ内の両方のラインを移動

+0

Thankxをアップロードしました。今は動作していますが、今は「ブールレスポンス」が「偽」となっています。この問題の別の投稿を作成する必要がありますか? Algor7 @ – Algor7

+0

: 'collectionDB.insert(DBMS_Constants.TABLE_NAME、ヌル、CVは)'メソッドが返すと、可能な場合は、その後K @prosper新しい質問 –

+0

を作成するかどうか確認する:それは戻っている-1 Algor7 @ – Algor7

1

これを試してください。

public class DbHelper extends SQLiteOpenHelper { 
    public static final String TABLE_NAME = "MY_COLLECTION"; 
    public static final String COLUMN_NAME_NAME = "Name"; 
    public static final String COLUMN_NAME_INFO = "Info"; 
    public static final String COLUMN_NAME_IMAGE = "Image"; 
    private static final String _ID = "id"; 

    private static final String TEXT_TYPE = " TEXT"; 
    private static final String COMMA_SEP = ","; 
    private static final String BLOB = "BLOB"; 


    private static final String SQL_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + 
      _ID + " INTEGER PRIMARY KEY," + 
      COLUMN_NAME_NAME + TEXT_TYPE + COMMA_SEP + 
      COLUMN_NAME_INFO + TEXT_TYPE + COMMA_SEP + 
      COLUMN_NAME_IMAGE + BLOB + ")"; 

    private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME; 

     // If you change the database schema, you must increment the database version. 
     public static final int DATABASE_VERSION = 1; 
     public static final String DATABASE_NAME = "FeedReader.db"; 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_TABLE); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
     db.execSQL(SQL_DELETE_ENTRIES); 
     onCreate(db); 
    } 

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    } 

    public boolean insertData(String name, String info, Bitmap bm){ 
     SQLiteDatabase sqLiteDatabase = getWritableDatabase(); 
     bitmapUtility utility = new bitmapUtility(); 
     byte[] image = utility.getBytes(bm); 
     ContentValues cv = new ContentValues(); 
     cv.put(COLUMN_NAME_NAME, name); 
     cv.put(COLUMN_NAME_INFO, info); 
     cv.put(COLUMN_NAME_IMAGE, image); 
     return sqLiteDatabase.insert(TABLE_NAME, null, cv) > 0; 

    } 

    public boolean deleteData(String name){ 
     SQLiteDatabase sqLiteDatabase = getWritableDatabase(); 
     return sqLiteDatabase.delete(TABLE_NAME, COLUMN_NAME_NAME + " = " + name, null) > 0; 
    } 

} 

そしてcall

DbHelper dbHelper = new DbHelper(getActivity()); 
    dbHelper.insertData(nameImage, resultTV.getText().toString(), finalBitmap); 
+0

あなたの答えは相当です。どうもありがとうございます。 – Algor7

関連する問題