Android Studio: Native не может создать новый байт [] - PullRequest
0 голосов
/ 09 марта 2019

Я занимаюсь разработкой приложения, в котором мне нужно сохранить изображение и текст в SQLite, а затем извлечь их.Что я сделал: сделать снимок с камеры, закодировать растровое изображение, а затем сохранить его в виде большого двоичного объекта.На самом деле я получаю эту ошибку кода: Native не может создать новый байт [].

Это мой класс базы данных:

public DiaryDatabaseHandler(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DB_NAME, factory, DB_VERSION);


}

@Override
public void onCreate(SQLiteDatabase db) {

    String createDb = "CREATE TABLE "+TABLE_NAME+" ( "+
            COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
            COLUMN_USERID+ " INTEGER, "+
            COLUMN_TITLE+ " TEXT, "+
            COLUMN_DESCRIPTION+ " TEXT, "+
            COLUMN_PHOTO+ " BLOB NOT NULL);";
    db = getWritableDatabase();
    db.execSQL(createDb);

}

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

    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);


}

public void addToDiary(diaryObject diaryToAdd){

    SQLiteDatabase db;
    ContentValues cv = new ContentValues();
    cv.put(COLUMN_USERID, diaryToAdd.getUserId());
    cv.put(COLUMN_TITLE,diaryToAdd.getTitle());
    cv.put(COLUMN_DESCRIPTION, diaryToAdd.getDescription());
    cv.put(COLUMN_PHOTO, diaryToAdd.getPhotoEncoded());
    db = getWritableDatabase();
    db.insert(TABLE_NAME,null,cv);
    db.close();

}

public ArrayList<diaryObject> getUserDiary(int userId){

    ArrayList<diaryObject> diaryList = new ArrayList<>();
    SQLiteDatabase db = getWritableDatabase();
    String selectQuery = "SELECT * FROM "+TABLE_NAME+" WHERE "+COLUMN_USERID+" = "+userId+";";
    Cursor cursor = db.rawQuery(selectQuery,null);
    diaryObject diaryToAdd;
    cursor.moveToFirst();

    while(!cursor.isAfterLast()){

        diaryToAdd = new diaryObject();
        diaryToAdd.setUserId(cursor.getInt(cursor.getColumnIndex(COLUMN_USERID)));
        diaryToAdd.setTitle(cursor.getString(cursor.getColumnIndex(COLUMN_TITLE)));
        diaryToAdd.setDescription(cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION)));
        diaryToAdd.setPhotoEncoded(cursor.getBlob(cursor.getColumnIndex(COLUMN_PHOTO)));
        diaryList.add(diaryToAdd);
    }


    cursor.close();
    return diaryList;

}

}

Этообъект, который мне нужно сохранить:

    public diaryObject(byte[] photo, String title, String description, int userId){

    this.photoEncoded = photo;
    this.title = title;
    this.description = description;
    this.userId = userId;


}

Затем в этом фрагменте я беру текст и изображение и сохраняю его в базе данных:

    public void setTitleDescription(){

    String title = titleText.getText().toString();
    String description = descText.getText().toString();
    byte[] picture = encodeBitmap();
    diaryObject diaryToAdd = new diaryObject();
    diaryToAdd.setUserId(SharedPrefManager.getInstance(getActivity()).getId());
    diaryToAdd.setTitle(title);
    diaryToAdd.setDescription(description);
    diaryToAdd.setPhotoEncoded(picture);
    dbHandler.addToDiary(diaryToAdd);

}

public void getPhoto(){
    Intent picIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(picIntent,0);

}

public byte[] encodeBitmap(){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 0, baos);
    return baos.toByteArray();
}

В этом фрагменте я показываюсписок:

public class UserDiaryList extends Fragment {
private ConstraintLayout layout;
private Button addToDiary;
private ListView diaryListView;
private CustomArrayAdapterDiary diaryAdapter;
public diaryObject diaryToOpen;
public static ArrayList<diaryObject> diaryList;

DiaryDatabaseHandler dbHandler;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.user_list_fragment, null);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    inizializeComponent();


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

            Fragment fragment = new UserAddDiaryFragment();
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.fragmentView, fragment)
                    .commit();

        }
    });

    diaryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            diaryToOpen = (diaryObject)parent.getItemAtPosition(position);
            OpenDiaryFragment.setDiaryObject(diaryToOpen);
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.fragmentView,new OpenDiaryFragment())
                    .commit();
        }
    });



}

public void inizializeComponent(){

    dbHandler = new DiaryDatabaseHandler(getActivity(),null,null,1);


    diaryList = dbHandler.getUserDiary(SharedPrefManager.getInstance(getActivity()).getId());
    if (diaryList == null){
        diaryList = new ArrayList<>();
    }
    addToDiary = getView().findViewById(R.id.buttonAddToDiary);
    diaryListView = getView().findViewById(R.id.listViewDiary);
    diaryAdapter = new CustomArrayAdapterDiary(getActivity(),diaryList);
    diaryListView.setAdapter(diaryAdapter);

    layout = getView().findViewById(R.id.constraintDiaryList);
}

}

и это адаптер:

public class CustomArrayAdapterDiary extends ArrayAdapter<diaryObject> {

private Context mContext;
private ArrayList<diaryObject> diaryList = new ArrayList<>();
private long startClickTime;
public CustomArrayAdapterDiary(@NonNull Context context, ArrayList<diaryObject> list) {
    super(context, 0 , list);
    mContext = context;
    diaryList = list;
}

@NonNull
@Override
public View getView(int position, @Nullable final View convertView, @NonNull ViewGroup parent) {
    View listItem = convertView;
    if(listItem == null){
        listItem = LayoutInflater.from(mContext).inflate(R.layout.diary_custom_adapter,parent,false);
    }


    final diaryObject currentDiary = diaryList.get(position);

    ImageView image = (ImageView)listItem.findViewById(R.id.imageViewDiary);
    byte[] imageAsBytes = currentDiary.getPhotoEncoded();
    ByteArrayInputStream imageStream = new ByteArrayInputStream(imageAsBytes);
    Bitmap imageB = BitmapFactory.decodeStream(imageStream);
    image.setImageBitmap(imageB);

    TextView title = (TextView) listItem.findViewById(R.id.textViewDiaryTitle);
    title.setText(currentDiary.getTitle());

    TextView description = (TextView) listItem.findViewById(R.id.textViewDiaryDescription);
    description.setText(currentDiary.getDescription());


    return listItem;
}

} ​​

Ошибка выдается в этой строке кода:

diaryToAdd.setPhotoEncoded(cursor.getBlob(cursor.getColumnIndex(COLUMN_PHOTO)));

, который находится в классе databseHandler, когда я пытаюсь загрузить байт [].

Я не могу понять, в чем проблема.Буду признателен за любой ответ и предложение.

...