美文网首页eiYo数据库Android技术
【Android】数据存储(三) 数据库(SQLite)

【Android】数据存储(三) 数据库(SQLite)

作者: 带心情去旅行 | 来源:发表于2016-05-31 20:11 被阅读1287次
    结果
    • 根据id获取一条数据,修改,删除。上面我们看到,插入的那条数据id是1
            DatabaseHelper helper = new DatabaseHelper(this);
            User user1 = helper.readAUser(1);           //查找id为1的用户
            Log.i(TAG, helper.readAUser(1).toString()); //显示id为1的用户
            user1.setAge(30);                           //将年龄改为30
            helper.updateAUser(user1);                  //更新数据库
            Log.i(TAG, helper.readAUser(1).toString()); //显示id为1的用户
            helper.deleteAUser(user1.getId());          //删除user1
            Log.i(TAG, helper.readAUser(1).toString()); //显示id为1的用户
    

    结果


    结果

    上面的代码中,分别打印了三次log。
    第一次使用id为1的用户;
    第二次是年龄被修改为30的用户;
    第三次是被删除的用户,因为用户不存在了,所以没有第三条log
    (由于helper.readAUser(1)没有获取到数据,返回null,接着使用了toString()出现空指针异常,闪退了,做了一个反面教材~~)。
    不管怎么说,这次的目的达到了,增删查改都ok了。

    小结

    使用SQLite就是在本地建了一个数据库,使用数据库中的表来保存数据。SQLite对数据的操作十分灵活,不过相比SharedPreferencesFile在使用上要复杂一些,而且要一点的数据库基础。

    附:DatabaseHelper完整代码

    package com.nostra13.universalimageloader.sample;
    
    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;
    
    /**
     * Created by Gavin on 2016/5/30.
     */
    public class DatabaseHelper extends SQLiteOpenHelper {
        /**
         * 数据库版本,需要升级数据库时只要加一即可
         */
        private static final int DATABASE_VERSION = 1;
        /**
         * 数据库名
         */
        private static final String DATABASE_NAME = "mySQLite.db";
    
        /**
         * 构造方法
         * 每次创建DatabaseHelper对象时,若本应用无该数据库,则新建数据库并调用onCreate方法;
         * 若该数据库已创建则直接使用已存在的数据库且跳过onCreate方法
         * factory : 当打开的数据库执行查询语句的时候 会创建一个Cursor对象, 这时会调用Cursor工厂类 factory, 可以填写null默认值
         * @param context   上下文
         */
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        /**
         * 创建数据库是时调用(只被调用一次)
         * @param db    数据库
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            //创建user表,属性:id(用户id,主键)、name(姓名)、age(年龄)
            db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(10),age INTEGER)");
        }
    
        /**
         * 跟新数据库时调用
         * @param db            数据库
         * @param oldVersion    旧版本号
         * @param newVersion    新版本号
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            //升级user表,添加性别
            //db.execSQL("ALTER TABLE user ADD COLUMN gender VARCHAR(2)");
        }
    
        /**
         * 插入一条数据
         * @param user  用户对象
         */
        public void insertAUser(User user) {
            //如果要对数据进行更改,就调用此方法得到用于操作数据库的实例,该方法以读和写方式打开数据库
            SQLiteDatabase database = getWritableDatabase();
            //向user表插入一条数据
            database.execSQL(
                    "INSERT INTO user(name, age) VALUES(?,?)",
                    new Object[]{user.getName(), user.getAge()});
        }
    
        /**
         * 更新一条用户数据
         * @param user  用户对象
         */
        public void updateAUser(User user) {
            SQLiteDatabase database = getWritableDatabase();
            //根据id更新一条数据
            database.execSQL(
                    "UPDATE user SET name=?, age=? WHERE id=?",
                    new Object[]{user.getName(), user.getAge(), user.getId()});
        }
    
        /**
         * 根据id删除一条数据
         * @param id    用户id
         */
        public void deleteAUser(Integer id) {
            SQLiteDatabase database = getWritableDatabase();
            //根据id删除一条数据
            database.execSQL("DELETE FROM user WHERE id=?",
                    new Object[]{id});
        }
    
        /**
         * 获取整个用户列表
         * @return
         */
        public List<User> readAllUser() {
            SQLiteDatabase database = getReadableDatabase();
            Cursor cursor = database.rawQuery("SELECT * FROM user", new String[]{});
            List<User> list = new ArrayList<User>();
            while (cursor.moveToNext()) {
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex("id")));
                user.setName(cursor.getString(cursor.getColumnIndex("name")));
                user.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                list.add(user);
            }
            cursor.close();
            return list;
        }
    
        /**
         * 读取一条数据
         * @param id    用户id
         * @return      用户对象
         */
        public User readAUser(Integer id) {
    
            //如果只对数据进行读取,建议使用此方法
            SQLiteDatabase database = getReadableDatabase();
            Cursor cursor  = database.rawQuery(
                    "SELECT * FROM user WHERE id=?",
                    new String[]{id.toString()});
            if (cursor.moveToFirst()) {
                //读取数据,并返回
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex("id")));
                user.setName(cursor.getString(cursor.getColumnIndex("name")));
                user.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                cursor.close();
                return user;
            } else {
                //未读出数据,返回空数据
                return null;
            }
        }
    }
    

    相关文章

      网友评论

      • XiaoHuai:你好,开了一个Thread插入用户手机通讯录数据到SQLite的时候,频繁出现database is locked,这个怎么解决?
        NKming:@XiaoHuai 把需要同步的方法加锁就好了
        赵先森Kevin:@XiaoHuai 事物处理。
        带心情去旅行:@XiaoHuai 你看下是不是同时执行了多个插入的操作,SQLite只支持库级锁——同时只能允许一个写操作。使用线程间的同步机制以避免同时操作。

      本文标题:【Android】数据存储(三) 数据库(SQLite)

      本文链接:https://www.haomeiwen.com/subject/dndcdttx.html