Я занимаюсь разработкой приложения, в котором мне нужно сохранить изображение и текст в 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, когда я пытаюсь загрузить байт [].
Я не могу понять, в чем проблема.Буду признателен за любой ответ и предложение.