Android 数据库存储SQLite总结

SQLite简介

http://blog.csdn.net/demonliuhui/article/details/67638246
上面的链接,里面的内容介绍了SQLite,和一些简单操作。
本文将对这些方法总结,然后根据不同的需求进行封装,方便调用用。

创建名为name的数据库

    public static SQLiteDatabase createSQLite(Context context, String name) {
      //创建或者打开数据库(需要使用绝对路径)
        SQLiteDatabase sdb = SQLiteDatabase.openOrCreateDatabase(
                context.getFilesDir().toString() + "/" + name + ".db3", null);
        return sdb;

在SD卡以程序命名的文件夹下创建名为name的数据库

因为创建数库的文件路径必须是存在的绝对路径,所以必须判断所属文件夹是否存在,不存在先创建文件夹再执行数据库的创建。

  public static SQLiteDatabase createSDSQLite(Context context, String name) {
        SQLiteDatabase sdb = null;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File file = null;
            try {
                file = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + "/" +
                        context.getResources().getString(R.string.app_name));
                if (!file.exists()) {//判读文件夹是否存在
                    file.mkdirs();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            sdb = SQLiteDatabase.openOrCreateDatabase(file.toString() + "/" + name + ".db3", null);
        }
        return sdb;
    }

判断某张表是否存在

因为不允许重复建表,所以建表前,因执行此方法进行判断表是否存在。
SQLite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等等信息。有时数据库升级时,由于等等原因,我们可能需要增加表、字段等等。可以采取以下方法来判断数据库中是否存在某表、字段等等。

select * from sqlite_master where type = 'table' and name = '表名'

如果查不到指定表名的信息,则表示该表不存在.

 public static boolean isTableExist(SQLiteDatabase sdb, String tableName) {
        boolean result = false;
        if (tableName == null) {
            return false;
        }
        Cursor cursor = null;
        try {
            String sql = "select count(*) as c from Sqlite_master  where type ='table' and name ='" + tableName.trim() + "' ";
            cursor = sdb.rawQuery(sql, null);
            if (cursor.moveToNext()) {
                int count = cursor.getInt(0);
                if (count > 0) {
                    result = true;
                }
            }
        } catch (Exception e) {
        }
        return result;
    }

判断某表里某字段是否存在

原理与判断表是否存在基本类似。

public static boolean isFieldExist(SQLiteDatabase db, String tableName, String fieldName) {
        String queryStr = "select sql from sqlite_master where type = 'table' and name = '%s'";
        queryStr = String.format(queryStr, tableName);
        Cursor c = db.rawQuery(queryStr, null);
        String tableCreateSql = null;
        try {
            if (c != null && c.moveToFirst()) {
                tableCreateSql = c.getString(c.getColumnIndex("sql"));
            }
        } finally {
            if (c != null)
                c.close();
        }
        if (tableCreateSql != null && tableCreateSql.contains(fieldName))
            return true;
        return false;
    }

创建数据表

 public static void createTable(SQLiteDatabase sdb, String table, String sql) {
        if (!SQLiteUtil.isTableExist(sdb, table)) {//判断表是否存在
            sdb.execSQL("create table " + sql);
        }
    }

删除数据表

    private void dropTable(SQLiteDatabase sdb, String table) {
        String sql = "DROP TABLE " + table;
        sdb.execSQL(sql);
    }

插入

      /**
     * 语句操纵,插入的方法
     *
     * @param sdb
     * @param sql 数据库操纵语句
     * @param columns 列对应的值
     */
    public static void insertData(SQLiteDatabase sdb, String sql, String[] columns) {
        sdb.execSQL(sql, columns);
    }

    /**
     * insert方法操纵,插入数据
     * 返回插入的行值,发送错误返回-1
     *
     * @param sdb
     * @param table 表名
     * @param values 插入的值key,value
     * @return
     */
    private static long insertSDB(SQLiteDatabase sdb, String table, ContentValues values) {
        long rowId = sdb.insert(table, null, values);
        return rowId;
    }

删除

/**
     * 方法操纵,删除
     *
     * @param sdb
     * @param table
     * @param whereClause 删除条件
     * @param whereArgs 向条件传入参数
     * @return
     */
    public static int deleteSDB(SQLiteDatabase sdb, String table, String whereClause, String[] whereArgs) {
        int result = sdb.delete(table, whereClause, whereArgs);
        return result;
    }

查找

  /**
     * query方法操纵
     *
     * @param sdb
     * @param table 表名
     * @param columns 列名
     * @param whereClause 条件
     * @param args 向条件传入参数
     * @return
     */
    public static Cursor querySDB(SQLiteDatabase sdb, String table, String[] columns, String whereClause, String[] args) {
        Cursor cursor = sdb.query(table, columns, whereClause, args, null, null, null);
        return cursor;
    }

    /**
     * 语句操纵select
     *
     * @param sdb
     * @param where 
     * @param sql 数据库操纵语句
     * @return
     */
    public static Cursor queryData(SQLiteDatabase sdb, String sql, String[] where) {
        Cursor cursor = sdb.rawQuery(sql, where);
        return cursor;
    }

更改

 /**
     * 方法操纵,更改
     *
     * @param sdb
     * @param table
     * @param values
     * @param whereClause 条件
     * @param whereArgs  向条件传入参数
     * @return
     */
    public static int updateSDB(SQLiteDatabase sdb, String table, ContentValues values, String whereClause, String[] whereArgs) {
        int result = sdb.update(table, values, whereClause, whereArgs);
        return result;//返回更新的条数
    }

关闭数据库

因为数据库属于资源操作,所以退出程序后应该像操作文件一样关闭数据库。该方法应该在onDestroy()
中调用。

public static void closeSDB(SQLiteDatabase sdb) {
        if (sdb != null && sdb.isOpen()) {
            sdb.close();
        }
    }

Demo

http://download.csdn.net/detail/demonliuhui/9795630

你可能感兴趣的:(Android笔记)