sqlite的光标列返回错误的值 [英] sqlite cursor returning wrong value for a column

查看:154
本文介绍了sqlite的光标列返回错误的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么我从数据库中获取从列网​​址

我在源码这样添加数据

 无效addObjects(对象对象){
        SQLiteDatabase DB = this.getWritableDatabase();

        ContentValues​​值=新ContentValues​​();

        values​​.put(OBJECT_ID,10); //对象名称
        values​​.put(OBJECT_NAME,H); //对象名称
        values​​.put(OBJECT_URLhttp://api.androidhive.info/images/sample.jpg); // URL对象
        values​​.put(OBJECT_TYPE,图像); //接触式
        的System.out.println(值);

        //插入行
        db.insert(TABLE_OBJECTS,空,价值观);
        db.close(); //闭幕数据库连接
    }
 

日志值 www.i我/的System.out的结果是:TYPE =图片名称= H ID = 10 URL = HTTP://api.androidhive.info/images/sample.jpg

然而,当我得到的所有结果我的url = NULL

 公开名单<对象> getAllObjects(){
    名单<对象> Objectslist =新的ArrayList<对象>();
    //选择所有查询
    字符串selectQuery =SELECT * FROM+ TABLE_OBJECTS;

    SQLiteDatabase DB = this.getWritableDatabase();
    光标光标= db.rawQuery(selectQuery,NULL);

    //遍历所有行和添加到列表
    如果(cursor.moveToFirst()){
        做 {
            对象对象=新的对象();
            Log.d(OBJECT_URL,OBJECT_URL);

            object.setId(cursor.getInt(cursor.getColumnIndex(OBJECT_ID)));
            object.setName(cursor.getString(cursor.getColumnIndex(对象)));
            object.setUrl(cursor.getString(cursor.getColumnIndex(OBJECT_URL)));
            //添加联系人列出
            Objectslist.add(对象);
        }而(cursor.moveToNext());
    }
 

这是主要的活动我得到的sqlite的结果

 名单,其中,对象和GT;对象= db.getAllObjects();
    Log.d(他,TTTTTT);
    的System.out.println(对象);
    DBadapter适配器=新DBadapter(getApplicationContext(),R.layout.grid_item_layout,对象);
 

这是系统outprint的结果

  [对象{n = 10,名称=HTTP://api.androidhive.info/images/sample.jpg,URL ='空',类型='空' ,类='空'},{对象ID = 10,名称=HTTP://api.androidhive.info/images/sample.jpg,URL ='空',类型='空',类别='空}
 

这是完整的源码级

 公共类数据库处理器扩展SQLiteOpenHelper {

//所有静态变量
//数据库版本
私有静态最终诠释DATABASE_VERSION = 1;



    //联系方式表名
    私有静态最后弦乐TABLE_OBJECTS =物;
    私有静态最后弦乐OBJECT_ID =ID;
    私有静态最后弦乐OBJECT_NAME =NAME;
    私有静态最后弦乐OBJECT_TYPE =类型;
    私有静态最后弦乐OBJECT_URL =URL;
    私有静态最后弦乐OBJECT_CATEGORY =类别;
    私有静态最后弦乐OBJECT_DATE_ADDED =DATE_ADDED;
    私有静态最后弦乐OBJECT_USERS_ID =USERS_ID;
    私有静态最后弦乐OBJECT_HIDE_YN =HIDE_YN;


    公共数据库处理器(上下文的背景下){
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    }

    //创建表
    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        db.execSQL(DROP TABLE IF EXISTS+ TABLE_OBJECTS);

        字符串CREATE_OBJECTS_TABLE =CREATE TABLE+ TABLE_OBJECTS +(
       + OBJECT_ID +INTEGER PRIMARY KEY AUTOINCREMENT,
       + OBJECT_NAME +VARCHAR(100)NULL,
        + OBJECT_TYPE +VARCHAR(10)NULL,
        + OBJECT_URL +VARCHAR(1000)NULL,
        + OBJECT_CATEGORY +VARCHAR(50)NULL,
        + OBJECT_DATE_ADDED +DATETIME NULL,
        + OBJECT_USERS_ID +NUMERIC(10)NULL,
        + OBJECT_HIDE_YN +VARCHAR(1)NULL);
        db.execSQL(CREATE_OBJECTS_TABLE);
    }
    //升级数据库
    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        如果存在//删除旧的表
        db.execSQL(DROP TABLE IF EXISTS+ TABLE_OBJECTS);

        //再次创建表
        的onCreate(DB);
    }

    / **
     *所有CRUD(创建,读取,更新,删除)操作
     * /

    //添加新联系人
    无效addObjects(对象对象){
        SQLiteDatabase DB = this.getWritableDatabase();

        ContentValues​​值=新ContentValues​​();

        values​​.put(OBJECT_ID,10); //对象名称
        values​​.put(OBJECT_NAME,H); //对象名称
        values​​.put(OBJECT_URLhttp://api.androidhive.info/images/sample.jpg); // URL对象
        values​​.put(OBJECT_TYPE,图像); //接触式
        的System.out.println(值);

        //插入行
        长ID = db.insert(TABLE_OBJECTS,空,价值观);
        的System.out.println(ID:+ ID);
        db.insert(TABLE_OBJECTS,空,价值观);
        db.close(); //闭幕数据库连接
    }
  //对象对象=新的对象(字符串);

    //获取单触点
    对象的getURL(字符串名称){
        SQLiteDatabase DB = this.getReadableDatabase();
        光标光标= db.query(TABLE_OBJECTS,新的String [] {OBJECT_URL,
                        OBJECT_NAME,OBJECT_CATEGORY,OBJECT_TYPE},OBJECT_NAME +=?,
                新的String [] {将String.valueOf(名称)},NULL,NULL,NULL,NULL);
        如果(光标!= NULL)
            cursor.moveToFirst();

        对象对象=新的对象(cursor.getString(0),cursor.getString(1)
                cursor.getString(2),cursor.getString(3));

        返回对象;
    }

    //获取所有联系人
    公开名单<对象> getAllObjects(){
        名单<对象> Objectslist =新的ArrayList<对象>();
        //选择所有查询
        字符串selectQuery =SELECT * FROM+ TABLE_OBJECTS;

        SQLiteDatabase DB = this.getWritableDatabase();
        光标光标= db.rawQuery(selectQuery,NULL);

        //遍历所有行和添加到列表
        如果(cursor.moveToFirst()){
            做 {
                对象对象=新的对象();
                Log.d(OBJECT_URL,OBJECT_URL);

                object.setId(cursor.getInt(cursor.getColumnIndex(OBJECT_ID)));
                object.setName(cursor.getString(cursor.getColumnIndex(对象)));
                object.setUrl(cursor.getString(cursor.getColumnIndex(OBJECT_URL)));
                //添加联系人列出
                Objectslist.add(对象);
            }而(cursor.moveToNext());
        }

        //返回联系人列表
        返回Objectslist;
    }

    //更新单触点
    公众诠释updateContact(对​​象对象){
        SQLiteDatabase DB = this.getWritableDatabase();

        ContentValues​​值=新ContentValues​​();
        values​​.put(OBJECT_NAME,object.getName()); //对象名称
        values​​.put(OBJECT_URL,object.getUrl()); // URL对象
        values​​.put(OBJECT_TYPE,object.getType()); //接触式
        values​​.put(OBJECT_CATEGORY,object.getCategory()); //联系范畴

        //更新行
        返回db.update(TABLE_OBJECTS,价值观,OBJECT_ID +=?,
                新的String [] {将String.valueOf(object.getId())});
    }

    //删除单个联系人
    公共无效deleteContact(对​​象对象){
        SQLiteDatabase DB = this.getWritableDatabase();
        db.delete(TABLE_OBJECTS,OBJECT_ID +=?,
                新的String [] {将String.valueOf(objects.getId())});
        db.close();
    }


    //获取联系人计数
    公众诠释getObjectsCount(){
        字符串countQuery =SELECT * FROM+ TABLE_OBJECTS;
        SQLiteDatabase DB = this.getReadableDatabase();
        光标光标= db.rawQuery(countQuery,NULL);
        cursor.close();

        //返回计数
        返回cursor.getCount();
    }

}
 

解决方案

在你的对象的getURL(字符串名称)的方法,改变

 光标光标= db.query(TABLE_OBJECTS,新的String [] {OBJECT_URL,
                OBJECT_NAME,OBJECT_CATEGORY,OBJECT_TYPE},OBJECT_NAME +=?,
                新的String [] {将String.valueOf(名称)},NULL,NULL,NULL,NULL);
 

 光标光标= db.query(TABLE_OBJECTS,新的String [] {OBJECT_ID,
                OBJECT_NAME,OBJECT_URL,OBJECT_TYPE},OBJECT_NAME +=?,
                新的String [] {将String.valueOf(名称)},NULL,NULL,NULL,NULL);
 

假设您的对象类的结构如下:

 公共类对象{
    私人字符串ID;
    私人字符串名称;
    私人字符串URL;
    私人字符串类型;

    //方法
}
 

TableColumn来参数(新的String [] {OBJECT_ID,OBJECT_NAME,OBJECT_URL,OBJECT_TYPE} ),您传递到 db.query()方法有尊重顺序相同的对象类(第 ID ,第二届名称,第三网​​址 4 键入

why I am getting from the database null from column url ?

I am adding data in sqlite like this

  void addObjects(Objects object) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(OBJECT_ID,"10" ); // OBJECT Name
        values.put(OBJECT_NAME, "H"); // OBJECT Name
        values.put(OBJECT_URL, "http://api.androidhive.info/images/sample.jpg"); // OBJECT URL
        values.put(OBJECT_TYPE, "image"); // Contact type
        System.out.println(values);

        // Inserting Row
        db.insert(TABLE_OBJECTS, null, values);
        db.close(); // Closing database connection
    }

the result of log values www.i I/System.out﹕ TYPE=image NAME=H ID=10 URL=http://api.androidhive.info/images/sample.jpg

however when I get all the result I have url = null

public List<Objects> getAllObjects() {
    List<Objects> Objectslist = new ArrayList<Objects>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_OBJECTS;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Objects object = new Objects();
            Log.d("OBJECT_URL", OBJECT_URL);

            object.setId(cursor.getInt(cursor.getColumnIndex(OBJECT_ID)));
            object.setName(cursor.getString(cursor.getColumnIndex(OBJECT_NAME)));
            object.setUrl(cursor.getString(cursor.getColumnIndex(OBJECT_URL)));
            // Adding contact to list
            Objectslist.add(object);
        } while (cursor.moveToNext());
    }

This is main activity I am getting the result of sqlite

List<Objects> Objects = db.getAllObjects();
    Log.d("he","tttttt");
    System.out.println(Objects);
    DBadapter adapter = new DBadapter(getApplicationContext(), R.layout.grid_item_layout, Objects);

this is the result of system outprint

[Objects{id=10, name='http://api.androidhive.info/images/sample.jpg', url='null', type='null', category='null'}, Objects{id=10, name='http://api.androidhive.info/images/sample.jpg', url='null', type='null', category='null'}

this is full sqlite class

     public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;



    // Contacts table name
    private static final String TABLE_OBJECTS = "OBJECTS";
    private static final String OBJECT_ID="ID";
    private static final String OBJECT_NAME="NAME";
    private static final String OBJECT_TYPE ="TYPE";
    private static final String OBJECT_URL ="URL";
    private static final String OBJECT_CATEGORY ="CATEGORY";
    private static final String OBJECT_DATE_ADDED ="DATE_ADDED";
    private static final String OBJECT_USERS_ID ="USERS_ID";
    private static final String OBJECT_HIDE_YN ="HIDE_YN";


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

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_OBJECTS);

        String CREATE_OBJECTS_TABLE ="CREATE TABLE " +TABLE_OBJECTS+"("
       + OBJECT_ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"
       + OBJECT_NAME +" VARCHAR(100) NULL,"
        + OBJECT_TYPE +" VARCHAR(10) NULL,"
        + OBJECT_URL +" VARCHAR(1000) NULL,"
        +OBJECT_CATEGORY +" VARCHAR(50) NULL,"
        +OBJECT_DATE_ADDED +" DATETIME NULL,"
        +OBJECT_USERS_ID +" NUMERIC(10) NULL,"
        +OBJECT_HIDE_YN +" VARCHAR(1) NULL) ";
        db.execSQL(CREATE_OBJECTS_TABLE);
    }
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_OBJECTS);

        // Create tables again
        onCreate(db);
    }

    /**
     * All CRUD(Create, Read, Update, Delete) Operations
     */

    // Adding new contact
    void addObjects(Objects object) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(OBJECT_ID,"10" ); // OBJECT Name
        values.put(OBJECT_NAME, "H"); // OBJECT Name
        values.put(OBJECT_URL, "http://api.androidhive.info/images/sample.jpg"); // OBJECT URL
        values.put(OBJECT_TYPE, "image"); // Contact type
        System.out.println(values);

        // Inserting Row
        long id = db.insert(TABLE_OBJECTS, null, values);
        System.out.println( "id:"+id);
        db.insert(TABLE_OBJECTS, null, values);
        db.close(); // Closing database connection
    }
  //  Objects object=new Objects(String );

    // Getting single contact
    Objects geturl(String name) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_OBJECTS, new String[] {OBJECT_URL,
                        OBJECT_NAME , OBJECT_CATEGORY, OBJECT_TYPE }, OBJECT_NAME + "=?",
                new String[] { String.valueOf(name) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        Objects object = new Objects(cursor.getString(0),cursor.getString(1),
                cursor.getString(2),cursor.getString(3));

        return object;
    }

    // Getting All Contacts
    public List<Objects> getAllObjects() {
        List<Objects> Objectslist = new ArrayList<Objects>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_OBJECTS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Objects object = new Objects();
                Log.d("OBJECT_URL", OBJECT_URL);

                object.setId(cursor.getInt(cursor.getColumnIndex(OBJECT_ID)));
                object.setName(cursor.getString(cursor.getColumnIndex(OBJECT_NAME)));
                object.setUrl(cursor.getString(cursor.getColumnIndex(OBJECT_URL)));
                // Adding contact to list
                Objectslist.add(object);
            } while (cursor.moveToNext());
        }

        // return contact list
        return Objectslist;
    }

    // Updating single contact
    public int updateContact(Objects object) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(OBJECT_NAME, object.getName()); // OBJECT Name
        values.put(OBJECT_URL, object.getUrl()); // OBJECT URL
        values.put(OBJECT_TYPE, object.getType()); // Contact type
        values.put(OBJECT_CATEGORY, object.getCategory()); // Contact category

        // updating row
        return db.update(TABLE_OBJECTS, values, OBJECT_ID + " = ?",
                new String[] { String.valueOf(object.getId()) });
    }

    // Deleting single contact
    public void deleteContact(Objects objects) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_OBJECTS, OBJECT_ID + " = ?",
                new String[] { String.valueOf(objects.getId()) });
        db.close();
    }


    // Getting contacts Count
    public int getObjectsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_OBJECTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }

}

解决方案

In your Objects geturl(String name) method , change

Cursor cursor = db.query(TABLE_OBJECTS, new String[] {OBJECT_URL,
                OBJECT_NAME , OBJECT_CATEGORY, OBJECT_TYPE }, OBJECT_NAME + "=?",
                new String[] { String.valueOf(name) }, null, null, null, null);

to

Cursor cursor = db.query(TABLE_OBJECTS, new String[] {OBJECT_ID,
                OBJECT_NAME , OBJECT_URL, OBJECT_TYPE }, OBJECT_NAME + "=?",
                new String[] { String.valueOf(name) }, null, null, null, null);

Supposing that your Objects class has the following structure:

public class Objects {
    private String id;
    private String name;
    private String url;
    private String type;

    // methods
}

the tableColumns argument (new String[] {OBJECT_ID,OBJECT_NAME , OBJECT_URL, OBJECT_TYPE }) that you pass to the db.query() method has to respect the same order as in your Objects class (first the id, 2nd name, 3rd url, 4th type)

这篇关于sqlite的光标列返回错误的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆