zoukankan      html  css  js  c++  java
  • Android开发教程 数据存储(2) SQLite

    Hi,大家好!

          今天我们主要来讲讲SQLite在Android中的使用。

          轻松下:

          写字楼里写字间,写字间里程序员;
         程序人员写程序,又拿程序换酒钱。
         酒醒只在网上坐,酒醉还来网下眠;
         酒醉酒醒日复日,网上网下年复年。
         但愿老死电脑间,不愿鞠躬老板前;
         奔驰宝马贵者趣,公交自行程序员。
         别人笑我忒疯癫,我笑自己命太贱;
         不见满街漂亮妹,哪个归得程序员。  :) 哎…

          SQLite简介

          大部分应用程序都要操作数据,,Android应用程序也不例外,本地数据应该存储在什么地方?Android使用开源的、与操作系统无关的SQL数据库 --大名鼎鼎的SQLite。SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB,很多大型公司所开发的产品都有它的存在。

        轻量级
       使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸相当小。

       独立性
       SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

       隔离性
       SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。

       跨平台
       SQLite 目前支持大部分操作系统,不止电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

       多语言接口
       SQLite 数据库支持多语言编程接口。

       安全性
       SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

       SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:

       1

    Sqlite基本数据类型有:

    VARCHAR 字符型

    NVARCHAR(15)可变字符型,

    TEXT 文本型,

    INTEGER 整型,

    FLOAT 浮点型,

    BOOLEAN布尔型,

    CLOB字符大对象,

    BLOB二进制大对象,

    TIMESTAMP日期型,

    NUMERIC(10,5) 数值型

    VARYING CHARACTER (24),

    NATIONAL VARYING CHARACTER(16)

    Sqlite也提供了JDBC驱动程序

    Class.forName("org.sqlite.JDBC");

    Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");

    //filename为你的SQLite数据名称

    使用SQLiteOpenHelper操作数据库

    getReadableDatabase()获得可读的SQLiteDatabase

    getWritableDatabase() 获得可写的SQLiteDatabase

    onCreate(SQLiteDatabase)

    onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

    onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    操作数据库

    1. 封装一个SQLite的操作类,并且在此使用继承SQLiteOpenHelper的方式实现

    SQLiteOpenHelper
    SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的

    onCreate(SQLiteDatabase),

    onUpgrade(SQLiteDatabase, int, int)方法
    onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。
    onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。

    2. 实现SQLiteOpenHelper类的构造函数及抽象方法.

    package TSD.Jason.DB;

    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;

    public class DBHelp extends SQLiteOpenHelper {

    private final static String DATABASE_NAME="StudentDB"; //数据库名称
    private final static int DATABASE_VERSION=1; //数据库默认版本
    private final static String TABLE_NAME="StudentInfo"; //数据表名称
    public final static String S_ID="sid"; // 列名
    public final static String S_NAME="sName";
    public final static String S_SEX="sSex";
    public final static String S_AGE="sAge";
    public final static String S_ADDRESS="sAddress";

    /**SQLiteOpenHelper类的构造函数 (注意: 必须实现的构造函数)
    *
    * 此构造函数用来 创建库和表 (第一次执行时,如果没有库、表,将创建库、表,以后将不再创建)
    *
    @param context 上下文对象
    *
    @param name 数据库名称
    *
    @param factory 创建Cursor的工厂类。参数是为了可以自定义Cursor创建
    *
    @param version 数据库版本号
    */
    public DBHelp(Context context, String name, CursorFactory factory,
    int version) {
    super(context, name, factory, version);

    }

    /**操作数据时,(增删改查)
    *
    *
    @param context 上下文对象
    *
    @param name 数据库名称
    *
    @param factory 创建Cursor的工厂类。参数是为了可以自定义Cursor创建
    *
    @param version 数据库版本号
    */
    public DBHelp(Context context) {
    this(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    /**需要根据版本号来实现修改
    *
    *此构造函数用来 修改库和表 (修改现有的库、表)
    *
    @param context 上下文对象
    *
    @param name 数据库名称
    *
    @param factory 创建Cursor的工厂类。参数是为了可以自定义Cursor创建
    *
    @param version 数据库版本号
    */
    public DBHelp(Context context ,int version) {
    this(context,DATABASE_NAME,null,version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    System.out.println("当第一次运行或者修改数据库时,将会自动执行");

    String createTableSQL = "create table " + TABLE_NAME + "("
    +S_ID + " integer primary key autoincrement,"
    +S_NAME + " nvarchar(10),"
    +S_SEX + " nvarchar(2),"
    +S_AGE + " int,"
    +S_ADDRESS + " nvarchar(50)"
    +")";
    db.execSQL(createTableSQL); // 执行SQL 需要使用execSQL()
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    System.out.println("-------------------------调用了一个修改库函数");

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    super.onOpen(db);
    System.out.println("当数据库打开时,执行");
    }



    }

    创建数据库

    DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
    //当获得了SQLiteDatabase对象,会自动检测是否第一次创建了库,表,如果没有将执行DBHelp类中的onCreate函数
    SQLiteDatabase db = dbHelp.getReadableDatabase();
    Toast.makeText(SQLiteActivity.this, "创建成功", Toast.LENGTH_SHORT).show();


    getWritableDatabase() 如果需要操作(增删改)数据库时,使用

    getReadableDatabase()查询数据

    删除及重命名数据库

    2

    在adb下查看数据库

     3

    1通过 ls 命令查询目录结构

    2通过cd 文件夹名称 进入对应的文件夹中

    3需要进入2次data文件夹

    4进入自己创建项目的包下

    5进入databases

    6通过 sqlite3 StudentDB 进入数据库

    在sqlite>提示符下输入

    .help 这个命令让我们看到许多命令

    .tables 查看所有表

    通过.tables 命令,可以查询此数据库下所有表名

    查询语句和SQLServer中一样,每一句Sql语句结束都需要分号;

    添加数据

    btn5.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

    DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
    SQLiteDatabase db = dbHelp.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("sName", txtName.getText().toString());
    contentValues.put("sSex", "男");
    if(dbHelp.InsertData(db, contentValues))
    Toast.makeText(SQLiteActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
    else
    Toast.makeText(SQLiteActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
    }
    });

    修改数据

    btn6.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

    DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
    SQLiteDatabase db = dbHelp.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("sName", txtsName.getText().toString());
    String whereClause = "sid=?"; //要修改数据的条件 值用?占位符
    String[] whereArgs = new String[]{txtsID.getText().toString()};
    if(dbHelp.UpdateData(db, contentValues, whereClause, whereArgs))
    Toast.makeText(SQLiteActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
    else
    Toast.makeText(SQLiteActivity.this, "修改失败", Toast.LENGTH_SHORT).show();
    }
    });

    删除数据

        btn7.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

    DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
    SQLiteDatabase db = dbHelp.getWritableDatabase();
    String whereClause = "sid=?"; //要删除数据的条件 值用?占位符
    String[] whereArgs = new String[]{txtID.getText().toString()};
    if(dbHelp.DeleteData(db, whereClause, whereArgs))
    Toast.makeText(SQLiteActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
    else
    Toast.makeText(SQLiteActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
    }
    });

    查询数据

    rawQuery()

    rawQuery() 是最简单的解决方法。例如:

    Cursor c=db.rawQuery(
    “SELECT * FROM Student WHERE sid=1 AND sname=‘zhangsan'", null);

    query()

    都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标

    操作游标

    通过使用 getCount() 方法得到结果集中有多少记录;
    通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;
    通过 getColumnNames() 得到字段名;
    通过 getColumnIndex() 转换成字段号;
    通过 getString(),getInt() 等方法得到给定字段当前记录的值;
    通过 requery() 方法重新执行查询得到游标;
    通过 close() 方法释放游标资源;
    SimpleCursorAdapter
    SimpleCursorAdapter
    可使用此类来绑定ListView 

    SimpleCursorAdapter simple = new SimpleCursorAdapter(SQLiteActivity.this, android.R.layout.simple_list_item_1, cur, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});

    studentList.setAdapter(simple);

    注意: 使用此类绑定数据,,必须注意sqlite的主键命名。由于simpleCursorAdapter的方法只识别_id,所以,当你用到sqlite的simpleCursorAdapter时,必须把数据表的主键命名为_id。否则就会出现 java.lang.IllegalArgumentException: column ‘_id’ does not exist 错误。

     查询数据
    public void BinderData(){
    DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
    SQLiteDatabase db = dbHelp.getReadableDatabase();
    /*参数
    * table 表名
    * columns 要查询的列名数组,所有列用 null
    * selection 要查询的条件 没有用null
    * selectionArgs 要查询的条件对应的值 没有用null
    * groupBy 分组 没有用null
    * having 分组后再次筛选 没有用null
    * orderBy 排序 没有用null
    *
    */
    Cursor cur = db.query("StudentInfo", null, null, null, null, null, null);
    //Cursor cur = db.rawQuery("select * from StudentInfo", null);

    //由于本例中使用的主键名不是_id 所以不能直接使用SimpleCursorAdapter 原因在PPT中已经做了说明
    //SimpleCursorAdapter simple = new SimpleCursorAdapter(SQLiteActivity.this, android.R.layout.simple_list_item_1, cur, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});
    //studentList.setAdapter(simple);
    ArrayList<HashMap<String, Object>> students = new ArrayList<HashMap<String,Object>>();
    HashMap<String, Object> hs ;
    for (cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) {
    System.out.println(cur.getInt(cur.getColumnIndex("sid"))+"aaaaaaaaa");
    hs = new HashMap<String, Object>();
    hs.put("sID", cur.getInt(cur.getColumnIndex("sid")));
    hs.put("sName", cur.getString(cur.getColumnIndex("sName")));
    hs.put("sSex", cur.getString(cur.getColumnIndex("sSex")));
    students.add(hs);
    }
    SimpleAdapter sim = new SimpleAdapter(SQLiteActivity.this, students, android.R.layout.simple_list_item_1, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});
    studentList.setAdapter(sim);
    }

     代码已上传北京天圣达网站,欢迎大家下载




  • 相关阅读:
    rabbitmq技术的一些感悟(一)
    用python做自己主动化測试--对server端的自己主动化測试(3)-很多其它http client实例
    huffman编码——原理与实现
    MS-SQLSERVER中的MSDTC不可用解决方法
    基础总结篇之中的一个:Activity生命周期
    STL vector使用方法介绍
    Cocos2d-x Render-NewCulling
    C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
    shell编程基础
    软考复习之路—组成原理
  • 原文地址:https://www.cnblogs.com/jasoncc/p/2303826.html
Copyright © 2011-2022 走看看