Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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 从sqlite检索图像时出错?_Java_Android - Fatal编程技术网

Java 从sqlite检索图像时出错?

Java 从sqlite检索图像时出错?,java,android,Java,Android,我正在尝试将图像存储到SQLite中,然后将图像检索回来。我已经搜索了其他与之相关的帖子,得到了一些线索和线索,但现在我被卡住了,并且得到了错误,我不知道为什么 图像已成功存储到SQLite数据库中,但当我尝试获取图像时,出现了错误 原因:java.lang.IllegalStateException:无法从游标窗口读取第0行第1列。在从光标访问数据之前,确保光标已正确初始化。 下面是我的代码 SQL帮助器类 import android.content.Context; import andr

我正在尝试将图像存储到SQLite中,然后将图像检索回来。我已经搜索了其他与之相关的帖子,得到了一些线索和线索,但现在我被卡住了,并且得到了错误,我不知道为什么

图像已成功存储到SQLite数据库中,但当我尝试获取图像时,出现了错误

原因:java.lang.IllegalStateException:无法从游标窗口读取第0行第1列。在从光标访问数据之前,确保光标已正确初始化。

下面是我的代码

SQL帮助器类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLHelperClass  extends SQLiteOpenHelper {



    public static  int DATABASE_VERSION = 12;
    public static  String DATABASE_NAME = "user_image_save.db";

    public static  String CREATE_TABLE = "CREATE TABLE";
    public static  String TEXT_TYPE = "TEXT";
    public static String BLOB = "BLOB";
    public static  String INTEGER_TYPE = "INTEGER";
    public static  String DROP_TABLE = "DROP TABLE IF EXISTS" ;
    public static  String AUTOINCREMENT = "INTEGER PRIMARY KEY AUTOINCREMENT" ;


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

    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE + " " + SQL_Constants.SavedIntoSQL.TABLE_SQL_SAVE_IMAGE

                + " ( " + SQL_Constants.SavedIntoSQL._ID + " " + AUTOINCREMENT + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_OWNER_ID + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_NAME + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_EMAIL + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_IMAGE + " " + BLOB+ ")" );

    }

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

        sqLiteDatabase.execSQL(DROP_TABLE);
        onCreate(sqLiteDatabase);
    }
}
import android.provider.BaseColumns;


import android.provider.BaseColumns;

public final class SQL_Constants {

    public static abstract class SavedIntoSQL implements BaseColumns {

        public static final String TABLE_SQL_SAVE_IMAGE = "imageSave";

        public static final String ID_DATA = _ID ;
        public static final String COLUMN_OWNER_ID = "owner_id";
        public static final String COLUMN_EMAIL = "email";
        public static final String COLUMN_NAME = "name";
        public static final String COLUMN_IMAGE = "user_image";



    }

}
常量类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLHelperClass  extends SQLiteOpenHelper {



    public static  int DATABASE_VERSION = 12;
    public static  String DATABASE_NAME = "user_image_save.db";

    public static  String CREATE_TABLE = "CREATE TABLE";
    public static  String TEXT_TYPE = "TEXT";
    public static String BLOB = "BLOB";
    public static  String INTEGER_TYPE = "INTEGER";
    public static  String DROP_TABLE = "DROP TABLE IF EXISTS" ;
    public static  String AUTOINCREMENT = "INTEGER PRIMARY KEY AUTOINCREMENT" ;


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

    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE + " " + SQL_Constants.SavedIntoSQL.TABLE_SQL_SAVE_IMAGE

                + " ( " + SQL_Constants.SavedIntoSQL._ID + " " + AUTOINCREMENT + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_OWNER_ID + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_NAME + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_EMAIL + " " + TEXT_TYPE + " , "
                +         SQL_Constants.SavedIntoSQL.COLUMN_IMAGE + " " + BLOB+ ")" );

    }

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

        sqLiteDatabase.execSQL(DROP_TABLE);
        onCreate(sqLiteDatabase);
    }
}
import android.provider.BaseColumns;


import android.provider.BaseColumns;

public final class SQL_Constants {

    public static abstract class SavedIntoSQL implements BaseColumns {

        public static final String TABLE_SQL_SAVE_IMAGE = "imageSave";

        public static final String ID_DATA = _ID ;
        public static final String COLUMN_OWNER_ID = "owner_id";
        public static final String COLUMN_EMAIL = "email";
        public static final String COLUMN_NAME = "name";
        public static final String COLUMN_IMAGE = "user_image";



    }

}
将数据存储到SQLite中

 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                                                    resource.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
                                                    byte[] bytes = byteArrayOutputStream.toByteArray();


                                                    Toast.makeText(UpdatedUserProfile.this, "Download Complete", Toast.LENGTH_SHORT).show();

                                                    ContentValues contentValues = new ContentValues();

                                                    contentValues.put(SQL_Constants.SavedIntoSQL.COLUMN_OWNER_ID, App.getAppInstance().getCurrentUser().getProperty("ownerId").toString());
                                                    contentValues.put(SQL_Constants.SavedIntoSQL.COLUMN_NAME, App.getAppInstance().getCurrentUser().getProperty("name").toString());
                                                    contentValues.put(SQL_Constants.SavedIntoSQL.COLUMN_EMAIL, App.getAppInstance().getCurrentUser().getEmail());
                                                    contentValues.put(SQL_Constants.SavedIntoSQL.COLUMN_IMAGE, bytes);


                                                    sqLiteDatabase.insert(SQL_Constants.SavedIntoSQL.TABLE_SQL_SAVE_IMAGE, null, contentValues);
取回数据

sqlHelperClass = new SQLHelperClass(UpdatedUserProfile.this);
        sqLiteDatabase = sqlHelperClass.getWritableDatabase();
        sqLiteDatabase = sqlHelperClass.getReadableDatabase();

        String projection [] = {

                SQL_Constants.SavedIntoSQL.COLUMN_OWNER_ID ,
                SQL_Constants.SavedIntoSQL.COLUMN_EMAIL ,
                SQL_Constants.SavedIntoSQL.COLUMN_NAME ,


        };


        cursor =  sqLiteDatabase.query(SQL_Constants.SavedIntoSQL.TABLE_SQL_SAVE_IMAGE , projection,
                null , null , null , null , null);



            cursor.moveToPosition(0);

            int statusOwnerId = cursor.getColumnIndex(SQL_Constants.SavedIntoSQL.COLUMN_OWNER_ID);
            int statusName = cursor.getColumnIndex(SQL_Constants.SavedIntoSQL.COLUMN_NAME);
            int statusEmail = cursor.getColumnIndex(SQL_Constants.SavedIntoSQL.COLUMN_EMAIL);
            int statusImage = cursor.getColumnIndex(SQL_Constants.SavedIntoSQL.COLUMN_IMAGE);

            String ownerIdAgain = cursor.getString(statusOwnerId);
            String name = cursor.getString(statusName);
            String email = cursor.getString(statusEmail);
            byte [] image = cursor.getBlob(statusImage);

            String compareValueOwnerId = sharedPreferencesDatabaseActivity.getString("userId", "");
            String compareValueUserName = sharedPreferencesDatabaseActivity.getString("userName", "");
            String compareValueEmail = sharedPreferencesDatabaseActivity.getString("userEmail", "");
我正在获取所有其他数据,如姓名、电子邮件、所有者id,但当我涉及到图像时,我会得到错误信息

这是导致错误的行

字节[]image=cursor.getBlob(statusImage)


非常感谢您提供的任何帮助

您的
投影
没有
列图像
因此
游标.getColumnIndex(SQL\u常量.SavedIntoSQL.COLUMN\u图像)
返回-1。试图读取列-1会导致此异常


如果图像斑点足够小,则将列添加到投影中会有所帮助。Android SQLite游标有一个有限的窗口,实际上您不能查询大于2MB的行。如果是这样的话,请考虑重构代码,这样就不会将图像存储在数据库中。而是将它们存储在文件系统中,并将它们的路径存储在数据库中。

我真是个傻瓜。。你是对的。。我花了3到4个小时试图找出问题所在。。谢谢你指出:P