Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将图像从相机保存到数据库_Java_Android_Sqlite_Nullpointerexception - Fatal编程技术网

Java 将图像从相机保存到数据库

Java 将图像从相机保存到数据库,java,android,sqlite,nullpointerexception,Java,Android,Sqlite,Nullpointerexception,在我的示例应用程序中,我想保存来自照相机和gallery的图像,并保存到sqlite数据库。这是我的密码 public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final int GAL_CODE = 24; private static final int CAM_COD

在我的示例应用程序中,我想保存来自照相机和gallery的图像,并保存到sqlite数据库。这是我的密码

public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();
private static final int GAL_CODE = 24;
private static final int CAM_CODE = 31;
private static final String ALLOW_KEY = "ALLOWED";
private static final String CAMERA_PREF = "camera_pref";

private ImageView imageView;
private EditText nameET, addrET;
private ImageButton galleryBtn, cameraBtn;
private Button saveBtn;

private String address;
private String name;

private DBHelper dbHelper;
private boolean fromCamera = false;
private boolean fromGallery = false;
private Uri outputFileUri;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dbHelper = new DBHelper(this);

    imageView = (ImageView) findViewById(R.id.image);
    nameET = (EditText) findViewById(R.id.nameET);
    addrET = (EditText) findViewById(R.id.addrET);
    galleryBtn = (ImageButton) findViewById(R.id.galleryBtn);
    cameraBtn = (ImageButton) findViewById(R.id.cameraBtn);
    saveBtn = (Button) findViewById(R.id.saveBtn);

    galleryBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            selectImage();
        }
    });

    cameraBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            takePhoto();
        }
    });


    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            saveUser();
        }
    });

}

private void takePhoto() {

    File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
    root.mkdirs();

    String fileName = "img_" + System.currentTimeMillis() + ".jpg";
    File sdCardImageMainDir = new File(root, fileName);
    outputFileUri = Uri.fromFile(sdCardImageMainDir);

    List<Intent> cameraIntents = new ArrayList<>();
    Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    PackageManager pm = getPackageManager();
    List<ResolveInfo> listCam = pm.queryIntentActivities(captureIntent, 0);

    for (ResolveInfo info: listCam){
        String packageName = info.activityInfo.packageName;
        Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
        intent.setPackage(packageName);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        cameraIntents.add(intent);
    }
    startActivityForResult(captureIntent, CAM_CODE);
}

private void saveUser() {

    name = nameET.getText().toString();
    address = addrET.getText().toString();

    if (!address.isEmpty() && !name.isEmpty()){
        User user = new User(name, address);
        dbHelper.saveInputField(user);
        dbHelper.close();
        startActivity(new Intent(MainActivity.this, ShowActivity.class));
    }

}

private void selectImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GAL_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GAL_CODE && resultCode == RESULT_OK){
        Uri imgUri = data.getData();

        if (imgUri != null){
            if(saveImageToDB(imgUri)){
                Toast.makeText(this, "Saved Image", Toast.LENGTH_SHORT).show();
            }

        }

    }

    if (requestCode == CAM_CODE && resultCode == RESULT_OK){
        Bitmap bitmap = (Bitmap) data.getExtras().get("data");
        if (bitmap != null){
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            byte[] imageinByte = outputStream.toByteArray();

            User user = new User(name, address, imageinByte);
            dbHelper.saveInputField(user);  // error on this line
        }
    }

}
我的数据库助手类如下所示:

public class DBHelper {

private static final String DATABASE_NAME = "UsersDemo.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "profileInfo";

private static final String COL_ID = "databaseId";
private static final String COL_NAME = "name";
private static final String COL_ADDRESS = "addr";
private static final String COL_IMAGE = "image";

private Context mCtx;

private DatabaseManager databaseManager;
private SQLiteDatabase db;

public DBHelper (Context context){
    this.mCtx = context;
    databaseManager = new DatabaseManager(mCtx);
}

public DBHelper open() throws SQLException{
    db = databaseManager.getWritableDatabase();
    return this;
}

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

public void saveInputField(User user){
    ContentValues values = new ContentValues();

    values.put(COL_NAME, user.getName());
    values.put(COL_ADDRESS, user.getAddress());
    values.put(COL_IMAGE, user.getImage());

    db.insert(TABLE_NAME, null, values);
    db.close();
}

public User getCurrentUser(int id){
    Cursor cursor = db.query(true, TABLE_NAME, new String[]{COL_ID, COL_NAME, COL_ADDRESS}, COL_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null);

    if (cursor != null && cursor.moveToFirst()){

        User user = new User(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getBlob(1));
        return user;
    }

    return null;

}

public void saveCamerayImage(byte[] imageBytes){
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_IMAGE, imageBytes);
    db.insert(TABLE_NAME, null, contentValues);
}

public void saveGalleryImage(byte[] imageBytes){
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_IMAGE, imageBytes);
    db.insert(TABLE_NAME, null, contentValues);
}

public byte[] getImage(){
    Cursor cursor = db.query(true, TABLE_NAME, new String[]{COL_IMAGE,}, null, null, null, null, COL_ID + " DESC", "1");
    if (cursor.moveToFirst()){
        byte[] blob = cursor.getBlob(cursor.getColumnIndex(COL_IMAGE));
        cursor.close();
        return blob;
    }
    cursor.close();
    Toast.makeText(mCtx, "No Image Found", Toast.LENGTH_SHORT).show();
    return null;
}


public class DatabaseManager extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String db_create = "Create Table " + TABLE_NAME + " ("
                + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COL_NAME + " TEXT, "
                + COL_ADDRESS + " TEXT, "
                + COL_IMAGE + " BLOB NOT NULL );";
        sqLiteDatabase.execSQL(db_create);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

}
}

运行应用程序时,我在日志中收到此错误消息。我似乎不明白为什么会出现这种情况

我的日志如下:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference
                                                                         at com.joey.example.dbsqlite.DBHelper.saveInputField(DBHelper.java:53)
                                                                         at com.joey.example.dbsqlite.MainActivity.onActivityResult(MainActivity.java:170)
                                                                         at android.app.Activity.dispatchActivityResult(Activity.java:6919)
                                                                         at android.app.ActivityThread.deliverResults(ActivityThread.java:4184)
                                                                         at android.app.ActivityThread.handleSendResult(ActivityThread.java:4231) 
                                                                         at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                         at android.os.Looper.loop(Looper.java:203) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6269) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 
有人能解释一下如何解决这个错误吗?谢谢。

在写入数据库时,您忘记在方法中调用open()
databaseManager.getWritableDatabase()
允许您对数据库进行写入

我还觉得在调用方法时不需要返回DBHelper

 public DBHelper open() throws SQLException {
        db = databaseManager.getWritableDatabase();
        return this;
    }

将图像保存到sqlite是一个坏主意,但是如果您仍然想继续,这里有一些代码

public static void insertPicture(byte[] data)
{

SQLiteDatabase db = thisAct.openOrCreateDatabase(ConstantCodes.IMAGE_DATABASE, 2, null);
ContentValues values = new ContentValues(1);
values.put("photo", data);
db.insert("photos", null, values);
db.close();

} 
快乐编码

你需要打电话

db = databaseManager.getWritableDatabase();

saveInputField
中,使用
db
对象执行任何操作。在处理
db

的其他方法中也要这样做,谢谢。这就解决了问题。再次谢谢谢谢你,我已经修好了。
db = databaseManager.getWritableDatabase();