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

posted @ 2014-09-16 20:24  developer_Kale  阅读(1173)  评论(0编辑  收藏  举报
网站流量统计工具