zoukankan      html  css  js  c++  java
  • SQLite中的增删改查

    虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作。

    首先是建立一个类,继承SQLiteOpenHelper

    这里面会建立一个数据库,并且初始化一个表。当然你可以建立多个数据库,等以后再自行建立表也可以

    DatabaseHelper.java

    package com.kale.sql;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DatabaseHelper extends SQLiteOpenHelper{
        
        private static DatabaseHelper mInstance = null;
        //数据库名字
        public static final String DATABASE_NAME = "SQLite_db";
        //版本号
        private static final int DATABASE_VERSION = 1;
        //建立默认表的语句
        private static final String CREAT_TABLE_TABLE_SQL = "create table default_table("
                + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "default_string TEXT);";
        
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }    
        
        public DatabaseHelper(Context context, String name, int version) {
            super(context, name, null, version);
        }
        
        
        public static synchronized DatabaseHelper getInstance(Context context) {
            if (mInstance == null) {
                mInstance = new DatabaseHelper(context);
            }
            return mInstance;
        }
    
        /* 
         * 初次使用时创建数据库表
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            //通过sql语句建立默认表
            db.execSQL(CREAT_TABLE_TABLE_SQL);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            /**可以拿到当前数据库的版本信息 与之前数据库的版本信息   如果不同,那么就更新数据库**/
            
        }
        //删除数据库
        public boolean deleteDatabase(Context context , String databaseName) {
            return context.deleteDatabase(databaseName);
        }
    }

    之后再制作一个工具类,这个类主要是获得一个对象,用它来操作数据库。简单来说就是初始化一个数据库对象,然后只需sql语句

    package com.kale.sql;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    
    public class DatabaseManager{
        
         DatabaseHelper mDbHelper = null;  
         //操作数据库的实例
         static SQLiteDatabase mDb = null;  
         Context mContext = null;  
         
         public DatabaseManager(Context context) {
             mContext = context;  
             mDbHelper = DatabaseHelper.getInstance(mContext);  
             mDb= mDbHelper.getReadableDatabase(); 
        }
         
         /**
         * 建立表
         * SQLite内部只支持NULL,INTEGER,REAL(浮点),TEXT(文本),BLOB(大二进制)5种数据类型
         * 建立表成功了,返回true
         */
        public boolean executeSql(String sql){
             try {
                 mDb.execSQL(sql);
                 return true;
             }
             catch(SQLiteException e){
                return false;
             }
         }
        
        public Cursor executeSql(String sql,String[]args){
             try {
                 return mDb.rawQuery(sql, args);
             }
             catch(SQLiteException e){
                 e.printStackTrace();
             }
             return null;
         }
        
        /**
         * 关闭连接 
         */
        public void closeDBhelper() {
            if (mDbHelper != null) {
                mDbHelper.close();
            }
        }
         
    }

    最后就是使用sql语句对android中的数据库进行操作了,仍旧是经典的增删改查

    package com.kale.sql;
    
    import android.app.Activity;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends Activity {
        DatabaseManager dbManager;
        String tag = "MainActivity";
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
    
            dbManager = new DatabaseManager(this);
            creatNewTable();
            deleteOldTable();
            insertData();
            deleteData();
            updateData();
            queryData();
            if (isDataExist()) {
                Log.i(tag, "存在这个值");
            }
            else {
                Log.e(tag, "查无此值");
            }
        }
        
        /**
         * 给数据库建立一个表
         */
        public void creatNewTable() {
            String createNewTable = "create table user_info(" +
                     "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
                    "name TEXT,"+
                     "age INTEGER,"+
                     "height REAL,"+
                    "phone TEXT);";  
            if(dbManager.executeSql(createNewTable)) {
                Log.i(tag, "建表成功");
            }else {
                Log.e(tag, "建表失败");
            }
        }
        
        /**
         * 通过表名来删除一个表 
         */
        public void deleteOldTable() {
            String sql = "drop table default_table";
            if(dbManager.executeSql(sql)) {
                Log.i(tag, "删除成功");
            }else {
                Log.e(tag, "删除失败");
            }
        }
        
        /**
         * 新增数据 
         */
        public void insertData() {
            String sql = "insert into user_info (name,age,height,phone) values('kale',20,180.7,'156789564475')";
            if(dbManager.executeSql(sql)) {
                Log.i(tag, "插入成功");
            }else {
                Log.e(tag, "插入失败");
            }
        }
        
        /**
         * 删除数据
         */
        public void deleteData() {
            String sql = "delete from user_info where height=180";
            if(dbManager.executeSql(sql)) {
                Log.i(tag, "删除成功");
            }else {
                Log.e(tag, "删除失败");
            }
        }
        
        public void updateData() {
            String sql = "update user_info set name='tony' where name='kale'";
            if(dbManager.executeSql(sql)) {
                Log.i(tag, "更新成功");
            }else {
                Log.e(tag, "更新失败");
            }
        }
        
        /**
         * 查询数据,?是占位符,用于和string数组搭配使用
         */
        public void queryData() {
            String sql = "select * from user_info where name=? limit 3";
            //查询name为tony的结果,当然可以用like来模糊查询了
            Cursor cursor = dbManager.executeSql(sql, new String[] {"tony"});
            if(cursor != null) {
                Log.i(tag, "查询成功,但不一定有这个数据");
                 while (cursor.moveToNext()) {  
                    Log.i(tag, "name = "+cursor.getString(cursor.getColumnIndex("name")));
                    Log.i(tag, "age = " + cursor.getString(cursor.getColumnIndex("age")));
                 }  
                 cursor.close();
            }else {
                Log.e(tag, "查询失败");
            }
        }
        
        /**
         * 查询数据,?是占位符,用于和string数组搭配使用
         */
        public boolean isDataExist() {
            String sql = "select * from user_info where name=?";
            //查询name为tony的结果,当然可以用like来模糊查询了
            Cursor cursor = dbManager.executeSql(sql, new String[] {"kale"});
            if(cursor != null) {
                //无论查询的值是否存在,这里的cursor都不为空,只是不会进入moveToNext()方法
                 while (cursor.moveToNext()) {  
                    return true;
                 }  
                 cursor.close();
            }
            return false;
        }
        
        @Override
        protected void onDestroy() {
            // TODO 自动生成的方法存根
            super.onDestroy();
            //最后关闭helper中的SqliteDataBase
            dbManager.closeDBhelper();
        }
        
    }

    源码下载:http://download.csdn.net/detail/shark0017/7927241

    辅助说明:

    cursor重要方法:

    close()   关闭游标,释放资源

    copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)     在缓冲区中检索请求的列的文本,将将其存储

    getColumnCount()    返回所有列的总数 

    getColumnIndex(String columnName)    返回指定列的名称,如果不存在返回-1

    getColumnIndexOrThrow(String columnName)    从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。

    getColumnName(int columnIndex)     从给定的索引返回列名

    getColumnNames()    返回一个字符串数组的列名

    getCount()    返回Cursor 中的行数 

    moveToFirst()    移动光标到第一行

    moveToLast()   移动光标到最后一行 

    moveToNext()   移动光标到下一行

    moveToPosition(int position)   移动光标到一个绝对的位置

    moveToPrevious()   移动光标到上一行

     

    SQL查询语句

    select * from film order by year limit 10;

    select * from film order by year desc limit 10;

    select count(*) from film;

    select * from film where starring like 'Jodie%';

    select * from film where starring='Jodie Foster';

    select title, year from film order by year desc limit 10;

    select columns from table_name where expression;

    最常见的用法,当然是倒出所有数据库的内容:

    select * from film;

    如果资料太多了,我们或许会想限制笔数:

    select * from film limit 10;

    或是照着电影年份来排列:

    select * from film order by year limit 10;

    或是年份比较近的电影先列出来:

    select * from film order by year desc limit 10;

    或是我们只想看电影名称跟年份:

    select title, year from film order by year desc limit 10;

    查所有茱蒂佛斯特演过的电影:

    select * from film where starring='Jodie Foster';

    查所有演员名字开头叫茱蒂的电影('%' 符号便是 SQL 的万用字符):

    select * from film where starring like 'Jodie%';

    查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份:

    select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;

    有时候我们只想知道数据库一共有多少笔资料:

    select count(*) from film;

    有时候我们只想知道1985年以后的电影有几部:

    select count(*) from film where year >= 1985;

    (进一步的各种组合,要去看SQL专书,不过你大概已经知道SQL为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)

    如何更改或删除资料

    了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。

    例如有一笔资料的名字打错了:

    update film set starring='Jodie Foster' where starring='Jodee Foster';

    就会把主角字段里,被打成'Jodee Foster'的那笔(或多笔)资料,改回成Jodie Foster。

    delete from film where year < 1970;

    就会删除所有年代早于1970年(不含)的电影了。

    其他sqlite的特别用法

    sqlite可以在shell底下直接执行命令:

    sqlite3 film.db "select * from film;"

    输出 HTML 表格:

    sqlite3 -html film.db "select * from film;"

    将数据库「倒出来」:

    sqlite3 film.db ".dump" > output.sql

    利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):

    sqlite3 film.db < output.sql

    在大量插入资料时,你可能会需要先打这个指令:

    begin;

    插入完资料后要记得打这个指令,资料才会写进数据库中:

    commit;

    参考:http://www.cnblogs.com/xFreedom/archive/2012/04/09/2439575.html

  • 相关阅读:
    SpringBoot 项目瘦身
    对比两个文本的异同
    Spring 事务不起作用的场景
    Controller 层数据校验实现思路
    Notify 类的实现思路
    backup: 使用 vim 时一定会用到的设置 --for-myself
    exercise: 反射获取指定的属性值 --CSharp
    exercise: 序列化和反序列化Xml --CSharp
    前缀
    华罗庚的数学思想
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3975736.html
Copyright © 2011-2022 走看看