Java 我想将图像另存为sqlite的路径并检索它,然后显示在ImageView上

Java 我想将图像另存为sqlite的路径并检索它,然后显示在ImageView上,java,android,sqlite,Java,Android,Sqlite,这是我的密码: public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode != RESULT_OK) { return; } ImageButton imageButton = (ImageButton) textEntryView.findViewById(R.id.imageButton); imag

这是我的密码:

public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (resultCode != RESULT_OK) {
        return;
    }
    ImageButton imageButton = (ImageButton) textEntryView.findViewById(R.id.imageButton);
    imageUri = data.getData();
    showToast(imageUri.getPath());
  • 我得到吐司上显示的图像路径对吗
  • 下面是要在ImageView上显示的另一个:

    public void setIvImg(String path) {
        this.ivImg.setImageURI(Uri.fromFile(new File(path)));
    }
    
  • 我在ImageView上显示图像是否正确

  • PS:我已经使用了
    READ\u EXTERNAL\u STORAGE
    权限。

    下面是一个示例,它将路径存储在名为image\u path的表中的数据库(名为itdb),该表每行有两列\u id(一个rowid的别名,因此唯一地将一行标识为long)和图像路径,用于图像文件的实际路径

    在本例中,为了简单起见(不需要权限),图像(一些JPG)已被放入assets文件夹中

    应用程序启动时会查看资产并存储包含.JPG的资产文件路径(这里没有什么特别之处)。loadImagePaths方法可以做到这一点

    • 注意:由于已使用唯一约束定义了图像\u路径列,因此将忽略现有图像(尽管会将异常写入日志)
    handleListView随后将通过一个游标从表中提取行,该游标是附加到ListView的SimpleCursorAdapter的源数据。设置了两个侦听器:-

    • 一个用于填充ImageView的单击
    • 另一个用于长单击,这将从数据库中删除条目,然后刷新列表视图。(重新运行应用程序将向数据库添加任何已删除的图像路径)
    有4个文件:-

    • MyenLinem20180927_Consumption.JPG
    • MyenLinem20180927_Overview.JPG
    • MyenLinem20180927_Production.JPG
    • MyenLinem20180927_ProductionGridView.JPG
    应用程序启动时的外观(未单击任何项目):-

    单击项目会显示图像,例如:-

    该应用程序由3个组件组成,布局activity\u main.xml、数据库助手DatabaseHelper.java和活动MainActivity.java

    activity_main.xml MainActivity.java
    public类MainActivity扩展了AppCompatActivity{
    字符串[]mAssetList;
    字符串mPath=“”;
    字符串mImageExtension=“.JPG”;
    列表视图mLV;
    图像视图mIV;
    数据库助手mDBHlpr;
    光标mCsr;
    简单的mSCA;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLV=this.findViewById(R.id.listview);
    mIV=this.findviewbyd(R.id.imageview);
    mDBHlpr=新数据库助手(此);
    loadImagePath();
    handleListView();
    }
    /**
    *显示、初始化或刷新ListView的句柄
    *
    *在初始化
    */
    私有void handleListView(){
    mCsr=mDBHlpr.getImageList();
    如果(mSCA==null){
    mSCA=新的SimpleCorsorAdapter(
    这
    android.R.layout.simple_list_item_1,mCsr,
    新字符串[]{DatabaseHelper.IMAGEPATH\u COL\u PATH},
    新int[]{android.R.id.text1},
    0
    );
    mLV.setAdapter(mSCA);
    mLV.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
    displayImage(mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.IMAGEPATH\u COL\u PATH));
    }
    });
    setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
    @凌驾
    公共布尔值长单击(AdapterView AdapterView,视图视图,int i,long l){
    mDBHlpr.deleteMagePathById(l);
    handleListView();//由于基础映像路径已被删除,请刷新Listview
    返回true;//指示事件已被处理
    }
    });
    }否则{
    mSCA.斯瓦普库索公司(mCsr);
    }
    }
    @凌驾
    受保护的空onDestroy(){
    mCsr.close();
    super.ondestory();
    }
    私有void displayImage(字符串imagepath){
    InputStream=null;
    试一试{
    is=this.getResources().getAssets().open(imagepath);
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    位图图像=BitmapFactory.decodeStream(is);
    试一试{
    is.close();
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    mIV.setImageBitmap(图像);
    }
    私有void loadImagePath(){
    试一试{
    MasseList=this.getAssets().list(mPath);
    }捕获(IOE异常){
    e、 printStackTrace();
    返回;
    }
    用于(字符串s:MasseList){
    如果(s.contains(mImageExtension)){
    mDBHlpr.addImagePath(多个);
    }
    }
    }
    }
    
    这演示了使用图像及其存储在数据库中的路径的基础知识

    • 注意:如果使用上述方法,则必须将一些具有JPG扩展名的文件复制到assets文件夹中(除非更改代码以处理不同的位置)

    我想你需要描述关于你的问题的更多细节。我想没有人能理解真正的问题是什么。存储图像路径是个坏主意。因为如果从内存中删除图像,它将无法工作。相反,您应该将图像转换为BLOB,然后将其保存到数据库中。联系人应用程序中也发生了同样的事情。你试过测试它吗?我得到了答案。谢谢everyone@SurenderKumar如果/当使用标准的基于Android光标的检索,图像达到大约2米时,它将变得
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#FFAAAAFF"
            />
    
        <ImageView
            android:id="@+id/imageview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#FFAAFFAA"
            />
    
    </LinearLayout>
    
    public class DatabaseHelper extends SQLiteOpenHelper {
        public static final String DBNAME = "itdb";
        public static final int DBVERSION = 1;
    
        public static final String TBNAME = "image_path";
        public static final String IMAGEPATH_COL_ID = BaseColumns._ID;
        public static final String IMAGEPATH_COL_PATH = "image_path";
    
        SQLiteDatabase mDB;
    
        public DatabaseHelper(Context context) {
            super(context, DBNAME, null, DBVERSION);
            mDB = this.getWritableDatabase();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
            String crt_imagepath_table = "CREATE TABLE IF NOT EXISTS " + TBNAME + "(" +
                    IMAGEPATH_COL_ID + " INTEGER PRIMARY KEY, " +
                    IMAGEPATH_COL_PATH + " TEXT UNIQUE" +
                    ")";
            db.execSQL(crt_imagepath_table);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    
        }
    
        public long addImagePath(String imagePath) {
            ContentValues cv = new ContentValues();
            cv.put(IMAGEPATH_COL_PATH,imagePath);
            return mDB.insert(TBNAME,null,cv);
        }
    
        public int deleteImagePathById(long id) {
            String whereclause = IMAGEPATH_COL_ID + "=?";
            String[] whereargs = new String[]{String.valueOf(id)};
            return mDB.delete(TBNAME,whereclause,whereargs);
        }
    
        public Cursor getImageList() {
            return mDB.query(TBNAME,null,null,null,null,null,null);
        }
    }
    
    public class MainActivity extends AppCompatActivity {
    
        String[] mAssetList;
        String mPath = "" ;
        String mImageExtension = ".JPG";
        ListView mLV;
        ImageView mIV;
    
        DatabaseHelper mDBHlpr;
        Cursor mCsr;
        SimpleCursorAdapter mSCA;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mLV = this.findViewById(R.id.listview);
            mIV = this.findViewById(R.id.imageview);
    
            mDBHlpr = new DatabaseHelper(this);
            loadImagePaths();
            handleListView();
        }
    
        /**
         * Handle displaying the ListView, initialising it or refreshing it
         *
         * When initialising the
         */
        private void handleListView() {
            mCsr = mDBHlpr.getImageList();
            if (mSCA == null) {
                mSCA = new SimpleCursorAdapter(
                        this,
                        android.R.layout.simple_list_item_1,mCsr,
                        new String[]{DatabaseHelper.IMAGEPATH_COL_PATH},
                        new int[]{android.R.id.text1},
                        0
                );
                mLV.setAdapter(mSCA);
                mLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        displayImage(mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.IMAGEPATH_COL_PATH)));
                    }
                });
                mLV.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                        mDBHlpr.deleteImagePathById(l);
                        handleListView(); // Refresh Listview as underlying image path has been deleted
                        return true; // indicate event has been handled
                    }
                });
            } else {
                mSCA.swapCursor(mCsr);
            }
        }
    
        @Override
        protected void onDestroy() {
            mCsr.close();
            super.onDestroy();
        }
    
        private void displayImage(String imagepath) {
            InputStream is = null;
            try {
                is = this.getResources().getAssets().open(imagepath);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Bitmap image = BitmapFactory.decodeStream(is);
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mIV.setImageBitmap(image);
        }
    
        private void loadImagePaths() {
            try {
                mAssetList = this.getAssets().list(mPath);
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
            for (String s: mAssetList) {
                if (s.contains(mImageExtension)) {
                    mDBHlpr.addImagePath(s);
                }
            }
        }
    }