数据存储之数据库操作

首先说二点说明:本文重点在代码上,代码每一步都要注释
其次:对于数据库的操作最后的数据查看,可以借助Sqlite expert 工具!同时对于数据库的操作,可以直接编写sql语句执行
以下为代码:

数据库的创建及升级

public class MyDataBaseHelper extends SQLiteOpenHelper {

    private Context mContext;

    /**
     * integer 表示整型
     * real 表示浮点型
     * text 表示文本型
     * blob 表示二进制类型
     * primary key  表示设为组件   autoincrement表示自增长
     * */
    public static final String CREAE_BOOK = "create table Books("
            +"id integer primary key autoincrement,"
            +"author text ,"
            +"price real,"
            +"pages integer,"
            +"name text)";


    public static final String CREAE_CATEGORY = "create table Categorys("
            +"id integer primary key autoincrement,"
            +"cate_name text ,"
            +"cate_code integer)";

    /**
     * 构造器参数:
     * 第二个参数:数据库名,创建数据库时使用
     * 第三个参数:我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null
     * 第四个参数:表示当前数据库的版本号,用于升级数据库操作。构建SQLiteOpenHelper的实例后,再调用它的
     * getWritableDatabase()或getReadableDatabase()方法就能够创建数据库了,数据库文件会 存放在
     * /data/data/<package_name>/databases/目录下,此时重写的onCreate方法也会得到执行
     * */
    public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    /**
     * 当数据库成功创建后,再次调用onCreate()方法时,是不会生效的
     * @param db
     * 通过File Explorer是无法查看到book表,但是能够看到数据库book.db文件,通常会有二个
     * 一个是我们自己产生的,一个是book.db-journal  让数据库能够支持事务而产生的临时文件
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库表
        db.execSQL(CREAE_BOOK);
        db.execSQL(CREAE_CATEGORY);
        Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
    }

    /**
     * 升级数据库:直接在onCreat()方法里面调用db.execSQL("")新的数据库表是不会创建的
     * 只有在创建数据库构造器的时候,将新的数据库的版本大于旧的数据库版本即可
     * 同时执行db.execSQL("drop table if exists <db_tabalname>");即数据库中如果
     * 存在该表,就将该表删除,然后再创建该表(但是有个问题:表删除了,数据也就没有了),所以有个方法可以保证升级数据库时,保证数据库数据不变。如下
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Books");
        db.execSQL("drop table if exists Categorys");
        //重新执行创建数据库表
        onCreate(db);
    }

//升级数据库保证数据库数据不遗失,判断旧版本的版本号,然后去执行sql,不用先删除

switch(oldVersion){
            case 3:
                db.execSQL("alter table Books add column category_id integer");
            default:
        }

具体对数据库的CRUD操作:

 /**
         * 创建数据库:getWriteableDatabase()和getReadableDatabase()这二个方法都可以创建或者打开一个现有
         * 的数据库(如果已存在,则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
         * 其区别是:当数据库不可写入的时候(如磁盘已满),getReadableDatabase()方法对象将只以读的方式打开数据库
         * 而getWriteableDatabase()方法则将出现异常
         */
        mMyDataBaseHelper = new MyDataBaseHelper(this, "book.db", null, 3);
        mCreateDB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //SQLiteDatabase对象 用于操作CRUD数据库
                mMyDataBaseHelper.getWritableDatabase();
            }
        });

        /**
         * 添加数据
         */
        mAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues values = new ContentValues();
                SQLiteDatabase DB = mMyDataBaseHelper.getWritableDatabase();
                values.put("name","The Da Vinci Code");
                values.put("author","Dan Brown");
                values.put("pages",454);
                values.put("price",16.98);
                /**插入第一条数据 参数分别是数据库表名 未赋值的的列设置为空 具体的内容值的对象
                同时这里需要注意SQLiteDatabase对象不能用创建数据库时的对象,否则会报空指针异常
                需要重新创建对象
                 */
                DB.insert("Books",null,values);
                values.clear();
                values.put("name","The Lost Symbol");
                values.put("author","Dan Brown");
                values.put("pages",510);
                values.put("price",18.88);
                //插入第二条数据
                DB.insert("Books",null,values);
                Toast.makeText(MainActivity.this,"插入数据成功",Toast.LENGTH_SHORT).show();
            }
        });

        /**
         * 更新数据
         * 更新名字为the da vinci code 的价格为11.11
         */
        mUpData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("price","11.11");
                db.update("Books",contentValues,"name = ?",new String[]{"The Da Vinci Code"});
            }
        });
        /**
         * 删除数据
         */
        mDelData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
                db.delete("Books","pages > ?",new String[]{"500"});
            }
        });

        /**
         * 查询数据,其参数最少也是7个
         * query()方法参数        对应SQL部分                    描述
         * table                from table_name               指定查询的表名
         * columns              select column1,column         指定查询的列名
         * selection            where column = value          指定where的约束条件
         * selectionArgs        --                            为where中的占位符提供具体的值
         * groupBy              group by column               指定需要group by的列
         * having               having column = value         对group by后的结果进一步约束
         * orderBy              order by column1,coulumn2     指定查询结果的排序方式
         */
        mQurData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
                Cursor cursor = db.query("Books", null, null, null, null, null, null);
                if (cursor != null && cursor.moveToFirst()) {
                    do {
                        //遍历cuusor对象
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.e("TAG","name"+name);
                        Log.e("TAG","author"+author);
                        Log.e("TAG","pages"+pages);
                        Log.e("TAG","price"+price);
                    } while (cursor.moveToNext());

                }
                if(cursor != null) {
                    cursor.close();
                }
            }
        });
    }

以上:就是一些基础的操作。

第三方的数据库,推荐使用郭霖的litepal
github地址如下:
https://github.com/LitePalFramework/LitePal

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值