• android学习---SQLite方式存储数据


    SQLite

      Android对SQLite数据库,提供了完全的支持,而所有创建的SQLite数据库,仅限于当前应用访问,如果其他应用需要访问,则必须提供的Content Provider的支持,并且SQLite数据库会随着Android应用的卸载而被删除。SQLite是一个嵌入式的数据库引擎,最后是以文件的形式保存数据的。从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作,当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写。因为SQLite仅适用于资源有限的小型设备,所以本身就不应该把大量数据存储在设备的SQLite数据库里,SQLite只适合存储一些小型的数据。

       为了使SQLite和其他数据库间的兼容性最大化,SQLite支持对列上类型进行“类型近似”,列的类型近似指的是存储在列上的数据进行推荐类型存储。所以虽然SQLite内部只支持NULL、INTEGER、REAL(浮点书)、TEXT(文本)和BLOB(大二进制对象)这五种数据类型,但实际上SQLite完全可以接受varchar(n)、char(n)、decimal(p,s)、date等类型数据,只不过SQLite会在运算或保存时将它们转换为上面五种数据类型中相应的类型。大多数数据库的引擎都是使用静态的、强类型的数据类型,数据的类型是由它的容器决定的,这个容器是指被存放的特定列。而SQLite使用的是动态类型,在SQLite中,值的数据类型跟值本身相关,而不是与它的容器相关,所以SQLite允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段说使用的数据类型。但是有一种情况例外,定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数意外的其他类型的数据时,SQLite会产生错误。

    SQLite数据库创建与维护

      从官方文档上了解到,在Android项目中,创建SQLite数据库推荐继承SQLiteOpenHelper类,然后重写其中的onCreate()方法,在onCreate()方法中,对执行数据库创建的SQL语句。而SQLiteOpenHelper不仅仅用于SQLite数据的创建,还可以对其进行维护,以及获得SQLiteDatabase这个数据库操作对象。

      SQLiteOpenHelper提供了两个构造器,用于传递当前上下文对象以及SQLite数据库版本信息,在SQLiteOpenHelper的继承类的构造函数中,会调用它,构造器的签名如下:

    • SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version).
    • SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactroy factory,int version,DatabaseErrorHandler errorHandler).

      上面的构造函数中,都是用于创建一个SQLite数据库,context为一个当前应用的上下文对象;name是数据库名称;factory是一个允许子类在查询时使用的游标,一般不用传Null;version是数据库版本号;errorHandler是一个接口,传递当数据库错误的时候,执行的补救方法。

      在SQLiteOpenHelper中,可以进行SQLite数据库的创建、维护、日志以及获取可读写的数据库对象,通过下面几个常用方法得到支持:

    • String getDatabaseName():获取数据库名。
    • SQLiteDatabase getReadableDatabase():创建或者打开一个可读的数据库对象。
    • SQLiteDatabase getWritableDatabase():创建或者打开一个可读/写的数据库对象。
    • abstract void onCreate(SQLiteDatabase db):当第一次调用SQLiteOpenHelper的时候执行,之后再次调用将不再执行,一般用于完成数据库初始化的工作。
    • void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):当数据库版本号发生向上更新时,被执行。
    • void onDowngrade(SQLiteDatabase db,int oldVersion,int newVersion):当数据库版本号发生向下更新时,被执行。

      下面提供一个简单的SQLiteOpenHelper的继承类代码,用于创建数据库以及表结构:

    package com.leaf.android.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DbOpenHelp extends SQLiteOpenHelper {
    
        private static String name = "mydb.db";// 表示数据库名称
        private static int version = 1;// 表示数据库的版本号码
    
        public DbOpenHelp(Context context) {
            super(context, name, null, version);
        }
    
        // 当数据库创建的时候,是第一次被执行,完成对数据库的表的创建
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 支持的数据类型:整型数据,字符串类型,日期类型,二进制的数据类型,
            String sql = "create table person(id integer primary key autoincrement,name varchar(64), address varchar(64))";
            db.execSQL(sql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            String sql = "alter table person add sex varcha(8)";
            db.execSQL(sql);
        }
    
    }

    Tips:当创建好SQLite数据库的之后,可以在/data/data/<package name>/databases目录下找到SQLite数据库文件。

    执行CRUD操作

      当使用SQLiteOpenHelper的getReadableDatabase()或者getWritableDatabase()方法获取到SQLiteDatabase对象,就可以对这个数据库进行操作了。

      对于熟悉SQL语句的开发者而言,其实只需要使用两个方法,即可执行所有CRUD操作,以下方法提供多个重载方法:

    • void execSQL():通过SQL语句执行一条非查询语句。
    • Cursor rawQuery():通过SQL语句执行一条查询语句。

      下面以一个示例讲解一下单纯使用SQL语句实现CRUD操作:

      接口代码:

    package com.leaf.android.service;
    
    import java.util.List;
    import java.util.Map;
    
    public interface PersonService {
    
        public boolean addPerson(Object[] params);
    
        public boolean deletePerson(Object[] params);
    
        public boolean updatePerson(Object[] params);
    
        public Map<String, String> viewPerson(String[] selectionArgs);
    
        public List<Map<String, String>> listPersonMaps(String[] selectionArgs);
    }

    接口的实现代码:

    package com.leaf.android.dao;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    import com.leaf.android.db.DbOpenHelp;
    import com.leaf.android.service.PersonService;
    
    public class PersonDao implements PersonService {
    
        private DbOpenHelp helper = null;
    
        public PersonDao(Context context) {
            helper = new DbOpenHelp(context);
        }
    
        public boolean addPerson(Object[] params) {
            boolean flag = false;
            // 实现对数据库的添加删除和修改查询的功能
            SQLiteDatabase database = null;
            try {
                String sql = "insert into person(name, address, sex) value(?,?,?) ";
                database = helper.getWritableDatabase();// 实现对数据库的写的操作
                // 执行SQL
                database.execSQL(sql, params);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (database != null) {
                    // finally中关闭数据库
                    database.close();
                }
            }
            return flag;
        }
    
        public boolean deletePerson(Object[] params) {
            boolean flag = false;
            SQLiteDatabase database = null;
            try {
                // 删除一条数据
                String sql = "delete from person where id = ?";
                database = helper.getWritableDatabase();
                database.execSQL(sql, params);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (database != null) {
                    database.close();
                }
            }
            return flag;
        }
    
        public boolean updatePerson(Object[] params) {
            boolean flag = false;
            SQLiteDatabase database = null;
            try {
                String sql = "update person set name = ? , address = ?, sex = ?, where id = ?";
                database = helper.getWritableDatabase();
                database.execSQL(sql, params);
                flag = true;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (database != null) {
                    database.close();
                }
            }
            return flag;
        }
    
        public Map<String, String> viewPerson(String[] selectionArgs) {
            Map<String, String> map = new HashMap<String, String>();
            SQLiteDatabase database = null;
            try {
                String sql = "select * from person where id = ?";
                database = helper.getWritableDatabase();
                Cursor cursor = database.rawQuery(sql, selectionArgs);
                // 获得数据库的列的个数
                int colums = cursor.getColumnCount();
                while (cursor.moveToNext()) {
                    for (int i = 0; i < colums; i++) {
                        String cols_name = cursor.getColumnName(i);
                        String cols_value = cursor.getString(cursor
                                .getColumnIndex(cols_name));
                        if (cols_value == null) {
                            cols_value = "";
                        }
                        map.put(cols_name, cols_value);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (database != null) {
                    database.close();
                }
            }
            return map;
        }
    
        public List<Map<String, String>> listPersonMaps(String[] selectionArgs) {
            List<Map<String, String>> list = new ArrayList<Map<String, String>>();
            String sql = "selece * from person";
            SQLiteDatabase database = null;
            try {
                database = helper.getWritableDatabase();
                Cursor cursor = database.rawQuery(sql, selectionArgs);
                int colums = cursor.getColumnCount();
                while (cursor.moveToNext()) {
                    Map<String, String> map = new HashMap<String, String>();
                    for (int i = 0; i < colums; i++) {
                        String cols_name = cursor.getColumnName(i);
                        String cols_value = cursor.getString(cursor
                                .getColumnIndex(cols_name));
                        if (cols_value == null) {
                            cols_value = "";
                        }
                        map.put(cols_name, cols_value);
                    }
                    list.add(map);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (database != null) {
                    database.close();
                }
            }
            return null;
        }
    
    }

    再写一个测试类测试这个数据操作类是否有效

    package com.leaf.android.test;
    
    import java.util.List;
    import java.util.Map;
    
    import android.test.AndroidTestCase;
    import android.util.Log;
    
    import com.leaf.android.dao.PersonDao;
    import com.leaf.android.db.DbOpenHelp;
    import com.leaf.android.service.PersonService;
    
    public class MyTest extends AndroidTestCase {
    
        private final String TAG = "main";
    
        public MyTest() {
        }
    
        public void createDb() {
            DbOpenHelp helper = new DbOpenHelp(getContext());
            helper.getWritableDatabase();
        }
    
        public void insertDb() {
            PersonService service = new PersonDao(getContext());
            Object[] params1 = { "张龙", "beijing", "male" };
            boolean flag = service.addPerson(params1);
            Object[] params2 = { "赵虎", "shanghai", "male" };
            flag = flag && service.addPerson(params2);
            Object[] params3 = { "王朝", "HK", "male" };
            flag = flag && service.addPerson(params3);
            Object[] params4 = { "马汉", "beijing", "female" };
            flag = flag && service.addPerson(params4);
            Log.i(TAG, "-----插入数据----->>" + flag);
        }
    
        public void deleteDb() {
            PersonService service = new PersonDao(getContext());
            Object[] params = { 1 };
            boolean flag = service.deletePerson(params);
            Log.i(TAG, "-----删除数据----->>" + flag);
        }
    
        public void updateDb() {
            PersonService service = new PersonDao(getContext());
            Object[] params = { "张三", "上海", "男", "2" };
            boolean flag = service.updatePerson(params);
            Log.i(TAG, "---------->>" + flag);
        }
    
        public void getDb() {
            PersonService service = new PersonDao(getContext());
            Map<String, String> map = service.viewPerson(new String[] { "2" });
            Log.i(TAG, "---------->>" + map.toString());
        }
    
        public void listDb() {
            PersonService service = new PersonDao(getContext());
            List<Map<String, String>> list = service.listPersonMaps(null);
            Log.i(TAG, "---------->>" + list.toString());
        }
    
    }

    原文链接:http://www.cnblogs.com/plokmju/p/android_SQLite.html

  • 相关阅读:
    CentOS7使用firewalld打开关闭防火墙与端口
    ssh连接卡在【To escape to local shell, press 'Ctrl+Alt+]'.】的解决方法
    本地链路地址
    RIFF和WAVE音频文件格式
    声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
    VS中C++ 项目重命名
    FFmpeg学习6:视音频同步
    FFmpeg学习5:多线程播放视音频
    FFmpeg学习4:音频格式转换
    FFmpeg数据结构:AVPacket解析
  • 原文地址:https://www.cnblogs.com/lea-fu/p/3311134.html
Copyright © 2020-2023  润新知