求助!Android数据库存取图片,不知道哪里错了

qq_35482399 2018-05-24 02:20:28
MainActivity文件:
package com.example.li.photo_pick;

import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;

public class MainActivity extends AppCompatActivity {

private SQLiteDatabase db;
private PictureDatabase pictureDatabase;
private Context mContext;

//private static final int CHOOSE_PHOTO = 0;
private ImageView imageView;
private ImageView imgShow;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imgView);
imgShow = findViewById(R.id.imgShow);
mContext = MainActivity.this;
pictureDatabase = new PictureDatabase(mContext);
}

public void openAlbum(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
Uri uri=data.getData();
ContentResolver cr=this.getContentResolver();
Bitmap bitmap=null;
Bundle extras=null;
if(requestCode==1){
String[] proj ={MediaStore.Images.Media.DATA};
Cursor actualimagecursor=managedQuery(uri,proj,null,null,null);
int actual_image_column_index=actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
String path=actualimagecursor.getString(actual_image_column_index);
try{
bitmap=BitmapFactory.decodeStream(cr.openInputStream(uri));
}catch(FileNotFoundException e){
e.printStackTrace();
}
imageView.setImageBitmap(bitmap);
}
}
}

/**
* 将图片存放入数据库
* 从image view中获取图片源bitmap,转为二进制数组存储
* @param view
*/
public void saveToDatabase(View view){
imageView.setDrawingCacheEnabled(true);
Bitmap bitmap = imageView.getDrawingCache();
imageView.setDrawingCacheEnabled(false);
db = pictureDatabase.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("pic", getPicture(bitmap));
db.insert("picture", null, cv);
Toast.makeText(this,"fuck you!",Toast.LENGTH_SHORT).show();
}

//将Bitmap转换成可以用来存储的byte[]类型,采用ByteBuffer实现
private byte[] getPicture(Bitmap bitmap) {
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());
return buffer.array();
}

public void imgShow(View view){
db = pictureDatabase.getReadableDatabase();
Cursor cursor = db.query("picture",null,null,null,null,
null,null);
byte[] imgByte = null;
if(cursor.moveToNext()){
imgByte = cursor.getBlob(cursor.getColumnIndex("pic"));
}
Bitmap bitmap = BitmapFactory.decodeByteArray(imgByte,0,imgByte.length);
imgShow.setImageBitmap(bitmap);
}

}


PictureDatabase文件:
package com.example.li.photo_pick;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.provider.BaseColumns;

import java.io.ByteArrayOutputStream;

public class PictureDatabase extends SQLiteOpenHelper {

//数据库名
private static final String DATABASE_NAME = "picture.db";
//数据库版本号
private static final int DATABASE_Version = 1;
//表名
//private static final String TABLE_NAME = "picture";

//创建数据库
public PictureDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_Version);
}
//创建表并初始化表
@Override
public void onCreate (SQLiteDatabase db) {
db.execSQL("CREATE TABLE picture(PID INTEGER PRIMARY KEY AUTOINCREMENT,pic blob not null)");
}

//更新数据库
@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">


<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="photo"
android:onClick="openAlbum"/>

<ImageView
android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="save"
android:onClick="saveToDatabase"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="show"
android:id="@+id/btn_show"
android:onClick="imgShow"/>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imgShow"/>

</LinearLayout>


在模拟器上运行不报错,但是无法创建数据表,无法存储,求解答!
...全文
1433 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rabbit47 2018-05-28
  • 打赏
  • 举报
回复
你图片在Bitmap里是bitmap=“”啊
qq_35482399 2018-05-28
  • 打赏
  • 举报
回复
引用 17 楼 w452828297 的回复:
我一般的是存取图片路径。省空间
这个帖子我设置了100分,最后时怎么算的,我想把分给你,不知道怎么操作
Rabbit47 2018-05-28
  • 打赏
  • 举报
回复
引用 19 楼 qq_35482399 的回复:
[quote=引用 17 楼 w452828297 的回复:] 我一般的是存取图片路径。省空间
还有一个问题请教您,我用Android Studio做App,找不到建的数据库表,在ddms里的data文件夹里也没有[/quote] https://blog.csdn.net/kuishao1314aa/article/details/79878000 你参考一下吧
引用 18 楼 qq_35482399 的回复:
[quote=引用 17 楼 w452828297 的回复:] 我一般的是存取图片路径。省空间
这个帖子我设置了100分,最后时怎么算的,我想把分给你,不知道怎么操作[/quote] 页面上有结贴按钮。进去后选择左边那个结贴方式。然后在我回答的楼层填上分数后再点一下结贴。大概是这样我现在进不去那个页面没办法给你截图
qq_35482399 2018-05-28
  • 打赏
  • 举报
回复
引用 17 楼 w452828297 的回复:
我一般的是存取图片路径。省空间

还有一个问题请教您,我用Android Studio做App,找不到建的数据库表,在ddms里的data文件夹里也没有
Rabbit47 2018-05-28
  • 打赏
  • 举报
回复
我一般的是存取图片路径。省空间
Rabbit47 2018-05-28
  • 打赏
  • 举报
回复
链接:https://pan.baidu.com/s/1BAqpnAFbQUTZ1Q3ne0-cZQ 密码:5ndw 改完了我对图片本身的转换研究不多只能做成这样你凑乎着看吧
qq_35482399 2018-05-27
  • 打赏
  • 举报
回复
引用 13 楼 w452828297 的回复:
private PictureDatabase pictureDatabase
private SQLiteDatabase dbw,dbr;
pictureDatabase=new PictureDatabase(this);
dbw= pictureDatabase.getWritableDatabase();
dbr= pictureDatabase.getReadableDatabase();
91行改成 cv.put( PictureDatabase."pic", getPicture(bitmap))
92行改成 dbw.insert(PictureDatabase."picture", null, cv);
104行改成 Cursor cursor = dbr.query(PictureDatabase."picture",null,null,null,null,null,null);
108行改成 imgByte = cursor.getBlob(cursor.getColumnIndex(PictureDatabase."pic"));
再不行你就把你工程给个下载链接吧

再次试了下,但是写上去是错误的,

这是下载链接,拜托了!
https://github.com/BlackFeathers/photo_pick
qq_35482399 2018-05-26
  • 打赏
  • 举报
回复
引用 9 楼 w452828297 的回复:
不一行一行给你指了 你所有数据库控制命令都没有引用数据库控制文件 PictureDatabas 。IDE不知道你的"picture" "pic" 和哪个数据库关联。应该是这样如有不对的地方欢迎指出!
不好意思我不是很明白你说的意思,引用数据库控制文件不是db = pictureDatabase.getReadableDatabase();吗?我试着改成你说的写法,也不起作用。
qq_35482399 2018-05-26
  • 打赏
  • 举报
回复
引用 6 楼 zhanlv 的回复:
不知道你说的什么问题,我试了你创建表SQL语句,是可以成功创建的,

表可以创建成功,但是无法存入图片数据,无法运行
Rabbit47 2018-05-26
  • 打赏
  • 举报
回复
private PictureDatabase pictureDatabase private SQLiteDatabase dbw,dbr; pictureDatabase=new PictureDatabase(this); dbw= pictureDatabase.getWritableDatabase(); dbr= pictureDatabase.getReadableDatabase(); 91行改成 cv.put( PictureDatabase."pic", getPicture(bitmap)) 92行改成 dbw.insert(PictureDatabase."picture", null, cv); 104行改成 Cursor cursor = dbr.query(PictureDatabase."picture",null,null,null,null,null,null); 108行改成 imgByte = cursor.getBlob(cursor.getColumnIndex(PictureDatabase."pic")); 再不行你就把你工程给个下载链接吧
Rabbit47 2018-05-26
  • 打赏
  • 举报
回复
引用 11 楼 qq_35482399 的回复:
[quote=引用 9 楼 w452828297 的回复:] 不一行一行给你指了 你所有数据库控制命令都没有引用数据库控制文件 PictureDatabas 。IDE不知道你的"picture" "pic" 和哪个数据库关联。应该是这样如有不对的地方欢迎指出!
不好意思我不是很明白你说的意思,引用数据库控制文件不是db = pictureDatabase.getReadableDatabase();吗?我试着改成你说的写法,也不起作用。[/quote] 存取方法没写对,
zhang106209 2018-05-25
  • 打赏
  • 举报
回复
是不是你没有加权限呀
qq_35482399 2018-05-25
  • 打赏
  • 举报
回复
但是我没有用到那个才注释掉的,所以并不是这个原因
Rabbit47 2018-05-25
  • 打赏
  • 举报
回复
不一行一行给你指了 你所有数据库控制命令都没有引用数据库控制文件 PictureDatabas 。IDE不知道你的"picture" "pic" 和哪个数据库关联。应该是这样如有不对的地方欢迎指出!
Rabbit47 2018-05-25
  • 打赏
  • 举报
回复
//private static final String TABLE_NAME = "picture";前面的//取消试试
Rabbit47 2018-05-25
  • 打赏
  • 举报
回复
MainActivity 104 改成Cursor cursor = db.query(PictureDatabase."picture",null,null,null,null,
Rabbit47 2018-05-25
  • 打赏
  • 举报
回复
你表名被你注释掉了啊!
Rabbit47 2018-05-25
  • 打赏
  • 举报
回复
引用 4 楼 qq_35482399 的回复:
但是我没有用到那个才注释掉的,所以并不是这个原因
db.insert("picture", null, cv);改成db.insert(PictureDatabase."picture", null, cv); 你再试试
玉宁_ 2018-05-25
  • 打赏
  • 举报
回复
不知道你说的什么问题,我试了你创建表SQL语句,是可以成功创建的,
qq_35482399 2018-05-24
  • 打赏
  • 举报
回复
为什么一个人都没有啊

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧