The use of andorid SQLite

The use of andorid SQLite

1. Create a database
a, write a class DBHelper inherit SQLiteOpenHelper.

b、重写 SQLiteOpenHelper的三个方法:onCreate(第一次创建的时候调用此方法),onUpgrade(更新的
时候调用此方法:参数newVersion 大于 oldBersion时调用),onOpen(每次打开数据库文件时调用)。

c、在 onCreate 方法中创建一个新的数据库文件:
    String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
    db.execSQL(sql);

2. Create a database management class to encapsulate the addition, deletion and search operations on the database.

对数据库进行操作有两种方法:

    1、通过SQLiteDatabase调用execSQL方法执行SQLite语言。
/**
     * 实现对数据库的添加 删除 修改
     * 
     * @param sql
     * @param bindArgs
     * @return
     */
    public boolean updataBySQL(String sql, Object[] bindArgs) {
        boolean falg = false;
        database = dbHelper.getWritableDatabase();
        try {
            database.execSQL(sql, bindArgs);
            falg = true;
        } catch (Exception e) {
            // TODO: handle exception
        }
        database.close();
        return falg;
    }

    /**
     * 单条记录查询
     * 
     * @param sql
     * @param selectionArgs
     * @return
     */
    public Map<String, String> queryBySQL(String sql, String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        Map<String, String> map = new HashMap<String, String>();
        Cursor cursor = database.rawQuery(sql, selectionArgs);
        int cols_len = cursor.getColumnCount();// 列的个数
        while (cursor.moveToNext()) {
            for (int i = 0; i < cols_len; 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);
            }
        }
        database.close();
        return map;
    }

    /**
     * 查找多条记录
     * 
     * @param sql
     * @param selectionArgs
     * @return
     */
    public List<Map<String, String>> queryMultiMaps(String sql,
            String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        Cursor cursor = database.rawQuery(sql, selectionArgs);
        int csls_len = cursor.getColumnCount();
        while (cursor.moveToNext()) {// 游标移动到下一个,不为0
            Map<String, String> map = new HashMap<String, String>();
            for (int i = 0; i < csls_len; 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);
        }
        database.close();
        return list;
    }
2、通过调用SQLiteDatabase子方法实现对数据库的编辑。
/**
     * 插入数据
     * 
     * @param table
     *            表名
     * @param nullColumnHack
     *            如果第三个参数values 为Null或者元素个数为0,
     *            由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
     *            insert语句必须给定一个字段名,如:insert into person(name)
     *            values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
     *            values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
     *            执行类似insert into person(personid)
     *            values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
     *            不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
     * @param values
     *            修改后的值 new一个ContentValues中,再添加
     * @return
     */
    public boolean insert(String table, String nullColumnHack,
            ContentValues values) {
        database = dbHelper.getWritableDatabase();
        boolean flag = false;
        long id = database.insert(table, nullColumnHack, values);
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 更新数据,修改数据 update person set name = ?, address=? where pid = ?
     * 
     * @param table
     *            表名
     * @param values
     *            对应的值
     * @param whereClause
     *            where条件
     * @param whereArgs
     *            占位符
     * @return
     */
    public boolean update(String table, ContentValues values,
            String whereClause, String[] whereArgs) {
        database = dbHelper.getWritableDatabase();
        boolean flag = false;
        long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 删除 delete from person where pid = ?
     * 
     * @param table
     *            表名
     * @param whereClause
     *            where条件
     * @param whereArgs
     *            占位符
     * @return
     */
    public boolean delete(String table, String whereClause, String[] whereArgs) {
        boolean flag = false;
        database = dbHelper.getWritableDatabase();
        long id = database.delete(table, whereClause, whereArgs);
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
     * [where][selection][selectionArgs
     * ][selectionArgs][groupBy][having][orderBy][limit];
     * 
     * @param distinct
     *            去掉重复的记录
     * @param table
     *            表名
     * @param columns
     *            列名
     * @param selection
     *            查询的过滤条件
     * @param selectionArgs
     *            过滤条件的值
     * @param groupBy
     *            分组
     * @param having
     *            对分组进行过滤的条件
     * @param orderBy
     *            排序
     * @param limit
     *            分页
     * @return
     */
    public Cursor query(boolean distinct, String table, String[] columns,
            String selection, String[] selectionArgs, String groupBy,
            String having, String orderBy, String limit) {
        database = dbHelper.getWritableDatabase();
        Cursor cursor = null;
        cursor = database.query(distinct, table, columns, selection,
                selectionArgs, groupBy, having, orderBy, limit);
        return cursor;
    }
两种方法对数据库的操作是一样的,第一种方法适合熟悉SQLite语言的人使用,第二种对SQLite语言不熟悉的人也可以使用。

对数据库操作结束后应当关闭数据库:
/**
     * 关闭数据库
     */
    public void close_SQLite() {
        if (database != null) {
            database.close();
        }
    }

After the database operation is encapsulated, it is only necessary to call the package to operate the database in the future, which is convenient and fast.

Directory Structure:
Write a picture description here

MainActivity class code:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

DBHelper class code:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {// 创建,打开,管理数据库
    private static final String DB_NAME = "mydb.db"; // 数据库名字
    private static final int VERSION = 1; // 数据库版本

    public DBHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        // 数据库建表语句
        String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
        db.execSQL(sql);
    }

    // 更新
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }
    //打开数据库
    @Override
    public void onOpen(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        super.onOpen(db);
    }
}

DBManager class code:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class DBManager {
    private DBHelper dbHelper;
    private SQLiteDatabase database;

    public DBManager(Context context) {
        // TODO Auto-generated constructor stub
        dbHelper = new DBHelper(context);

    }

    /**
     * 实现对数据库的添加 删除 修改
     * 
     * @param sql
     * @param bindArgs
     * @return
     */
    public boolean updataBySQL(String sql, Object[] bindArgs) {
        boolean falg = false;
        database = dbHelper.getWritableDatabase();
        try {
            database.execSQL(sql, bindArgs);
            falg = true;
        } catch (Exception e) {
            // TODO: handle exception
        }
        database.close();
        return falg;
    }

    /**
     * 单条记录查询
     * 
     * @param sql
     * @param selectionArgs
     * @return
     */
    public Map<String, String> queryBySQL(String sql, String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        Map<String, String> map = new HashMap<String, String>();
        Cursor cursor = database.rawQuery(sql, selectionArgs);
        int cols_len = cursor.getColumnCount();// 列的个数
        while (cursor.moveToNext()) {
            for (int i = 0; i < cols_len; 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);
            }
        }
        database.close();
        return map;
    }

    /**
     * 查找多条记录
     * 
     * @param sql
     * @param selectionArgs
     * @return
     */
    public List<Map<String, String>> queryMultiMaps(String sql,
            String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        Cursor cursor = database.rawQuery(sql, selectionArgs);
        int csls_len = cursor.getColumnCount();
        while (cursor.moveToNext()) {// 游标移动到下一个,不为0
            Map<String, String> map = new HashMap<String, String>();
            for (int i = 0; i < csls_len; 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);
        }
        database.close();
        return list;
    }

    // -----------使用SQLiteDatabase中方法对数据库进行操作----------
    /**
     * 插入数据
     * 
     * @param table
     *            表名
     * @param nullColumnHack
     *            如果第三个参数values 为Null或者元素个数为0,
     *            由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
     *            insert语句必须给定一个字段名,如:insert into person(name)
     *            values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
     *            values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
     *            执行类似insert into person(personid)
     *            values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
     *            不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
     * @param values
     *            修改后的值 new一个ContentValues中,再添加
     * @return
     */
    public boolean insert(String table, String nullColumnHack,
            ContentValues values) {
        database = dbHelper.getWritableDatabase();
        boolean flag = false;
        long id = database.insert(table, nullColumnHack, values);
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 更新数据,修改数据 update person set name = ?, address=? where pid = ?
     * 
     * @param table
     *            表名
     * @param values
     *            对应的值
     * @param whereClause
     *            where条件
     * @param whereArgs
     *            占位符
     * @return
     */
    public boolean update(String table, ContentValues values,
            String whereClause, String[] whereArgs) {
        database = dbHelper.getWritableDatabase();
        boolean flag = false;
        long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 删除 delete from person where pid = ?
     * 
     * @param table
     *            表名
     * @param whereClause
     *            where条件
     * @param whereArgs
     *            占位符
     * @return
     */
    public boolean delete(String table, String whereClause, String[] whereArgs) {
        boolean flag = false;
        database = dbHelper.getWritableDatabase();
        long id = database.delete(table, whereClause, whereArgs);
        flag = id > 0 ? true : false;
        database.close();
        return flag;
    }

    /**
     * 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
     * [where][selection][selectionArgs
     * ][selectionArgs][groupBy][having][orderBy][limit];
     * 
     * @param distinct
     *            去掉重复的记录
     * @param table
     *            表名
     * @param columns
     *            列名
     * @param selection
     *            查询的过滤条件
     * @param selectionArgs
     *            过滤条件的值
     * @param groupBy
     *            分组
     * @param having
     *            对分组进行过滤的条件
     * @param orderBy
     *            排序
     * @param limit
     *            分页
     * @return
     */
    public Cursor query(boolean distinct, String table, String[] columns,
            String selection, String[] selectionArgs, String groupBy,
            String having, String orderBy, String limit) {
        database = dbHelper.getWritableDatabase();
        Cursor cursor = null;
        cursor = database.query(distinct, table, columns, selection,
                selectionArgs, groupBy, having, orderBy, limit);
        return cursor;
    }

    /**
     * 关闭数据库
     */
    public void close_SQLite() {
        if (database != null) {
            database.close();
        }
    }
}

Test code using unit tests (don't forget to add unit tests in the manifest file before using unit tests):

import java.util.List;
import java.util.Map;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;

public class myTset extends AndroidTestCase {
    // 创建数据库
    public void initTable() {
        DBHelper manage_SQLite = new DBHelper(getContext());
        SQLiteDatabase sqLiteDatabase = manage_SQLite.getReadableDatabase();// manage_SQLite.getWritableDatabase();
                                                                            // 调用这两个方法之一数据库才会创建
    }

    public void insert() { // 添加
        String sql = "insert into person(name,address) values(?,?)";
        Object[] bin = { "光电科技股份有限公司", "长沙" };
        DBManager manager = new DBManager(getContext());
        manager.updataBySQL(sql, bin);
    }

    public void update() { // 修改 更新 把 pid等于4的行,name 更新成 "郭jian凯",address修改成"长沙"
        String sql = "update person set name = ?, address=? where pid = ?";
        Object[] bin = { "郭凯", "长沙", 4 };
        DBManager manager = new DBManager(getContext());
        manager.updataBySQL(sql, bin);
    }

    public void delete() { // 删除 删除 pid等于4的行
        String sql = "delete from person  where pid = ?";
        Object[] bin = { 4 };
        DBManager manager = new DBManager(getContext());
        manager.updataBySQL(sql, bin);
    }

    public void query1() {// 查询单条记录
        String sql = "select * from person where pid = ?";
        DBManager manager = new DBManager(getContext());
        Map<String, String> map = manager.queryBySQL(sql, new String[] { "2" });
        System.out.println("-->>" + map.get("name"));
        System.out.println("-->>" + map.get("address"));
    }

    public void query2() {// 查询多条记录 查找出 name 列包含 “郭”的行
        String sql = "select * from person where name like ?";
        DBManager manager = new DBManager(getContext());
        List<Map<String, String>> list = manager.queryMultiMaps(sql,
                new String[] { "%郭%" });
        for (Map<String, String> map2 : list) {
            System.out.println("-->>" + map2.get("name"));
            System.out.println("-->>" + map2.get("address"));
        }

    }

    // -----------使用SQLiteDatabase 的方法操作数据库--------
    public void insert1() { // 添加
        // 添加数据 使用SQLiteDatabase带的方法
        DBManager manager = new DBManager(getContext());
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", "ss");
        contentValues.put("address", "sss沙");
        manager.insert("person", null, contentValues);
    }

    public void update2() { // 修改 更新 将表“person”中pid = 4的行,中内容修改成 contentValues的值
        DBManager manager = new DBManager(getContext());
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", "修改");
        contentValues.put("address", "修改");
        manager.update("person", contentValues, "pid = ?", new String[] { "5" });
    }

    public void delete2() { // 删除 删除 pid等于2 的行
        DBManager manager = new DBManager(getContext());
        manager.delete("person", "pid = ?", new String[] { "2" });
    }

    public void query() { // 查找
        DBManager manager = new DBManager(getContext());
        Cursor cursor = manager.query(false, "person", null, null, null, null,
                null, null, null);
        while (cursor.moveToNext()) {
            System.out.println("--query->>"
                    + cursor.getString(cursor.getColumnIndex("name")));
        }
        manager.close_SQLite();// 关闭数据库
    }
}

http://blog.csdn.net/q296264785/article/details/53172873

Published 34 original articles · Like 10 · Visits 30,000+

Guess you like

Origin blog.csdn.net/q296264785/article/details/53155739