Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Android 使用自定义对象ArrayList从Sqlite获取数据?_Android_Sqlite_Android Sqlite - Fatal编程技术网

Android 使用自定义对象ArrayList从Sqlite获取数据?

Android 使用自定义对象ArrayList从Sqlite获取数据?,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,这是Employee类的代码 public class Employee { String name; String email; byte[] picture; public Employee(String name, String email, byte[] picture) { this.name = name; this.email = email; this.picture = picture; } } 这是我从数据库中获取数据的代码,目前数据库不起作用,因

这是Employee类的代码

public class Employee {
String name;
String email;
byte[] picture;

public Employee(String name, String email, byte[] picture) {
    this.name = name;
    this.email = email;
    this.picture = picture;
}
}
这是我从数据库中获取数据的代码,目前数据库不起作用,因为我不知道如何从数据库中获取这三样东西(字符串名称、电子邮件和字节数组图像)。然而,我已经成功地将这三件事插入到Sqlite数据库中

**编辑:**这是我数据库类的完整代码

package com.cplusplusapp.rashidfaheem.hybridsoftwaresolutions.hbss.rashidfaheem.image2database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;



public class Sqlite_database extends SQLiteOpenHelper {


private static final String DATABASE_NAME="myCustomerDatabase";
private static final String DATABASE_TABLE="Customers";
private static final int DATABASE_VERSION=1;

public static final String KEY_ROWID="id";
public static final String KEY_Name="customer_name";
public static final String KEY_Email="customer_email";
public static final String KEY_IMAGE="image";

private SQLiteDatabase ourDatabase;

ArrayList<Employee> elist;

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

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("CREATE TABLE " + DATABASE_TABLE + "(" +
            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            KEY_Name + " TEXT, " +
            KEY_Email + " TEXT, " +
            KEY_IMAGE + " BLOB);"
    );

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    onCreate(sqLiteDatabase);
}



public List<Employee> getImage(){

    List<Employee> employee_list = new ArrayList<>();
    ourDatabase = this.getReadableDatabase();
    String[] field = {KEY_Name,KEY_Email,KEY_IMAGE};
    Cursor c = ourDatabase.query(DATABASE_TABLE, field, null, null, null, null, null);

    int iname = c.getColumnIndex(KEY_Name);
    int iemail = c.getColumnIndex(KEY_Email);
    int image = c.getColumnIndex(KEY_IMAGE);


    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        String name = c.getString(iname);
        String email = c.getString(iemail);
        byte[] pic = c.getBlob(image);
        employee_list.add(new Employee(name, email, pic));

    }

    return employee_list;
}




public long createImageEntry(String name, String email, byte[] image) {
    ourDatabase=this.getWritableDatabase();
    ContentValues cv=new ContentValues();
    cv.put(KEY_Name, name);
    cv.put(KEY_Email, email);
    cv.put(KEY_IMAGE, image);

    return ourDatabase.insert(DATABASE_TABLE, null, cv);

}
}
package com.cplusplusapp.rashidfaheem.hybridsoftwaresolutions.hbss.rashidfaheem.image2database;
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入java.util.ArrayList;
导入java.util.List;
公共类Sqlite_数据库扩展了SQLiteOpenHelper{
私有静态最终字符串数据库\u NAME=“myCustomerDatabase”;
私有静态最终字符串数据库\u TABLE=“Customers”;
私有静态最终int数据库_VERSION=1;
公共静态最终字符串键\u ROWID=“id”;
公共静态最终字符串KEY\u Name=“customer\u Name”;
public static final String KEY\u Email=“customer\u Email”;
公共静态最终字符串键\u IMAGE=“IMAGE”;
私有SQLITE数据库;
艾利斯特;
公共Sqlite_数据库(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase SQLiteDatabase){
execSQL(“创建表”+数据库表+”(“+
KEY_ROWID+“整数主键自动递增,”+
按键名称+“文本,”+
密钥_电子邮件+“文本,”+
键_图像+“BLOB);”
);
}
@凌驾
public void onUpgrade(SQLiteDatabase SQLiteDatabase,inti,inti1){
execSQL(“如果存在删除表”+数据库表);
onCreate(sqLiteDatabase);
}
公共列表getImage(){
List employee_List=new ArrayList();
ourDatabase=this.getReadableDatabase();
String[]字段={KEY\u Name,KEY\u Email,KEY\u IMAGE};
游标c=ourDatabase.query(数据库表,字段,null,null,null,null,null);
int iname=c.getColumnIndex(键名称);
int iemail=c.getColumnIndex(KEY_Email);
int image=c.getColumnIndex(KEY_image);
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String name=c.getString(iname);
String email=c.getString(iemail);
字节[]pic=c.getBlob(图像);
员工列表。添加(新员工(姓名、电子邮件、pic));
}
返回员工名单;
}
公共长createImageEntry(字符串名称、字符串电子邮件、字节[]图像){
ourDatabase=this.getWritableDatabase();
ContentValues cv=新的ContentValues();
简历(姓名、钥匙);
简历(钥匙、电子邮件、电子邮件);
cv.put(按键图像、图像);
返回ourDatabase.insert(DATABASE_TABLE,null,cv);
}
}
这是点击按钮上的代码,从返回的arraylist中获取姓名和电子邮件,并通过文本视图显示。但这是一个错误。 java.lang.IllegalStateException:无法从CursorWindow读取第0行、第0列。在从光标访问数据之前,请确保光标已正确初始化

 btnView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sql = new Sqlite_database(MainActivity.this);
            List<Employee> employees = sql.getImage();

            for (Employee e : employees) {
                r_name = r_name + e.name;
                r_email = r_email + e.email;

            }

            tvName.setText(r_name);
            tvEmail.setText(r_email);
        }
    });
btnView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
sql=新的Sqlite_数据库(MainActivity.this);
List employees=sql.getImage();
对于(员工e:员工){
r_name=r_name+e.name;
电子邮件=电子邮件+电子邮件;
}
tvName.setText(r_名称);
tvEmail.setText(r_email);
}
});

每次通过for循环时,您都会向
员工列表
分配一个新的
员工
对象

将您的
员工列表更改为此

List<Employee> employee_list = new ArrayList<Employee>();
完整的代码如下所示

public List<Employee> getImage(){

    List<Employee> employee_list = new ArrayList<Employee>();
    ourDatabase = this.getReadableDatabase();
    String[] field = {KEY_Name,KEY_Email,KEY_IMAGE};
    Cursor c = ourDatabase.query(DATABASE_TABLE, field, null, null, null, null, null);

    int iname = c.getColumnIndex(KEY_Name);
    int iemail = c.getColumnIndex(KEY_Email);
    int image = c.getColumnIndex(KEY_IMAGE);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        String name = c.getString(iname);
        String email = c.getString(iemail);
        byte[] pic = c.getBlob(image);
        employee_list.add(new Employee(name, email, pic));

    }

    return employee_list;
}
List<Employee> employees = getImage();

for (Employee employee : employees) {
    // You can use employee here that represents an Employee entry in the list
}
公共列表getImage(){
List employee_List=new ArrayList();
ourDatabase=this.getReadableDatabase();
String[]字段={KEY\u Name,KEY\u Email,KEY\u IMAGE};
游标c=ourDatabase.query(数据库表,字段,null,null,null,null,null);
int iname=c.getColumnIndex(键名称);
int iemail=c.getColumnIndex(KEY_Email);
int image=c.getColumnIndex(KEY_image);
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String name=c.getString(iname);
String email=c.getString(iemail);
字节[]pic=c.getBlob(图像);
员工列表。添加(新员工(姓名、电子邮件、pic));
}
返回员工名单;
}
你可以这样使用它

public List<Employee> getImage(){

    List<Employee> employee_list = new ArrayList<Employee>();
    ourDatabase = this.getReadableDatabase();
    String[] field = {KEY_Name,KEY_Email,KEY_IMAGE};
    Cursor c = ourDatabase.query(DATABASE_TABLE, field, null, null, null, null, null);

    int iname = c.getColumnIndex(KEY_Name);
    int iemail = c.getColumnIndex(KEY_Email);
    int image = c.getColumnIndex(KEY_IMAGE);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        String name = c.getString(iname);
        String email = c.getString(iemail);
        byte[] pic = c.getBlob(image);
        employee_list.add(new Employee(name, email, pic));

    }

    return employee_list;
}
List<Employee> employees = getImage();

for (Employee employee : employees) {
    // You can use employee here that represents an Employee entry in the list
}
List employees=getImage();
用于(员工:员工){
//您可以在此处使用employee,它表示列表中的员工条目
}

您的实际问题是什么?我在Sqlite数据库中添加了三个内容。员工姓名、员工电子邮件和员工图片(通过将pic转换为字节[])。现在我想使用Employee类检索这三件事。我知道这是可能的,但不知道怎么做。
我添加了三个东西…
哪些“东西”?!我猜您添加了三个新列(或字段,如果您愿意的话)三件事=2个字符串值+1个字节数组形式的图像。您真的不想告诉我们这些神秘的东西是什么?行值?柱?桌子?三明治?你能编辑我的全部代码来实现我的目标吗?这就是我想做的。我在Sqlite数据库中添加了三个内容。员工姓名、员工电子邮件和员工图片(通过将pic转换为字节[])。现在我想使用Employee类检索这三件事。我知道这是可能的,但不知道如何。更新了我的答案。从外观上看,您已经选择了名称、电子邮件和图片,但您没有将其添加到列表中。相反,您重写相同的变量,只返回最后一个thinghanx。你能告诉我如何提取姓名、电子邮件和字符串吗