• 【转载】Android数据存储之SQLite


    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

    在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下。

    主要特点:

    -轻量级

    -独立性,没有不依赖,无需安装

    -跨平台,支持众多操作系统

    -支持高达2TB大小的数据库

    -每个数据库以单个文件的形式存在

    -以B-Tree的数据结构形式存储在硬盘

    SQLite的数据类型:

    SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型

    分别代表:空值、整型值、浮点值、字符串值、二进制对象。

    动态数据类型(弱引用):

    当某个值插入到数据库中时,SQLite将会检测它的数据类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。

    在Android中使用SQLite主要涉及两个类:

    SQLiteDatabaseSQLiteOpenHelper,下面对这两个类进行主要的分析。

    SQLiteDatabase

    这个类提供了一些管理SQLite数据库的方法,比如创建、删除、执行SQL命令,和执行其他常见的数据库管理任务的方法。每个程序的数据库名字是唯一的。

    常用方法:

    db.execSQL(String sql) //执行任何的SQL语句

    db.insert(String table,String nullColumnHack,ContentValues values) //插入记录

    db.delete(String table,String whereClause,String[] whereArgs)//删除记录

    db.update(String table,ContentValues values,String whereClause,String[] whereArgs)//更新记录

    db.query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查询记录

    db.rawQuery(String sql,String[] selectionArgs)//通过sql语句查询记录

    下面是一个简单操作SQLite数据库的示例:

    复制代码
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //每个程序都有自己的数据库
            //通过openOrCreateDatabase来打开或创建一个数据库,返回SQLiteDatabase对象
            /**
             *  openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory)
             *  name: 数据库名
             *  mode: 数据库权限,MODE_PRIVATE为本应用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE分别为全局可读和可写。
             *  factory: 可以用来实例化一个cusor对象的工厂类
             */
            SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
            //创建一个表
            db.execSQL("create table if not exists userTb (" +
                        "_id integer primary key," +
                        "name text not null,age integer not null," +
                        "sex text not null)");
            //向表中插入记录
            db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
            db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')");
            db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')");
            //Cursor为查询结果对象,类似于JDBC中的ResultSet
            Cursor queryResult = db.rawQuery("select * from userTb", null);
            if (queryResult != null) {
                while (queryResult.moveToNext()) {
                    Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
                              + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
                              + " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
                              + " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
                }
                //关闭游标对象
                queryResult.close();
            }
            //关闭数据库
            db.close();
        }
    }
    复制代码

    当执行完openOrCreateDatabase("user.db",MODE_PRIVATE,null)后,会在/data/data/<包名>/databases/目录下创建一个数据库文件,打开DDMS可以查看。也可以将其导出,使用navigate等工具打开查看里面的数据。

    另外,上述示例对记录的操作是使用execSQL()方法通过原生的SQL语句进行的,当然也可以使用上面介绍的SQLiteDatabase常用的方法来操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入记录举例,当数据量不大时,通过execSQL()使用SQL语句进行插入与使用insert()方法插入记录的效率是差不多的,但是如果数据量比较大,那么使用前者比使用后者的效率明显高出很多。

    SQLiteOpenHelper

    这个类为SQLiteDatabase的帮助类,主要用于管理数据库的创建与版本更新。SQLiteHelper是一个抽象类,一般通过创建一个继承自它的子类并重写onCreat()和onUpgrade()方法进行使用。

    -onCreat(SQLiteDatabase db) //首次创建数据库时调用,一般用于建表等操作。

    -onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)//当升级数据库版本时调用

    下面是使用SQLiteOpenHelper的一个简单示例:

    创建一个继承自SQLiteOpenHelper的子类

    复制代码
    public class SQLiteHelper extends SQLiteOpenHelper {
        /**
         *  context:上下文对象
         *  name:数据库名
         */
        public SQLiteHelper(Context context, String name) {
            super(context, name, null, 1);
        }
    
        //首次创建数据库的时候调用,一般进行建表或某些初始化的操作
        @Override
        public void onCreate(SQLiteDatabase db) {
            //建表
            db.execSQL("create table if not exists userTb (" +
                    "_id integer primary key," +
                    "name text not null,age integer not null," +
                    "sex text not null)");
        }
    
        //当数据库版本升级时自动调用
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    复制代码

    然后就可以通过SQLiteHelper的实例获取一个SQLiteDatabase对象,进而对数据库进行一系列的操作了。

    复制代码
    public class MainActivity2 extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            //创建一个SQLiteHelper对象
            SQLiteHelper helper = new SQLiteHelper(MainActivity2.this,"stu.db");
            //使用getWritableDatabase()或getReadableDatabase()方法获得SQLiteDatabase对象
            SQLiteDatabase db = helper.getWritableDatabase();
            //插入记录
            db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
            db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')");
            db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')");
            //获取游标对象
            Cursor queryResult = db.rawQuery("select * from userTb", null);
            if (queryResult != null) {
                //打印所有记录
                while (queryResult.moveToNext()) {
                    Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
                            + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
                            + " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
                            + " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
                }
                //关闭游标对象
                queryResult.close();
            }
            //关闭数据库
            db.close();
        }
    }
    复制代码
  • 相关阅读:
    老贴纪念九(蓝色 白色 绿色(前四天))
    进入6月
    老贴纪念七!(敏感:二十年了,而青春从来没有离开过)
    一个关于inet_ntoa的奇怪问题
    一个通用的Makefile模板
    【记录】find+tar命令组合
    Linux SDIO WIFI驱动的编译
    编译静态库和动态库的Makefile文件
    分解成连续数字的和
    linux nc命令示例
  • 原文地址:https://www.cnblogs.com/csschn/p/5258633.html
Copyright © 2020-2023  润新知