Android中SQLite使用及DataBase管理

在实际项目编码中,大家可能经常用到sharepreference和sqlite用于数据存储,其底层原理都是以文件的形式进行存储。今天我们就来讲讲sqlite存储的使用。使用过数据库的小伙伴们对sqlite的使用应该能够很快上手。见代码。

在操作sqlite数据库时,一共用到三个类:SQLiteOpenHelper,SQLiteDatabase,Cursor(结果集)。一共包含五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象),但是在编码的时候像弱语言,varchar等数据类型也能识别,可能是自动转换成text数据类型了。所以我比较习惯用sql命令来操作,减少了很多麻烦。

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by qiang.lin,NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象)
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private static final String DATA_NAME = "user.db";
    private static final int VERSION=1;


    public MySQLiteOpenHelper(Context context) {
        super(context, DATA_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE user(id VARCHAR(10) NOT NULL,name VARCHAR(10) NOT NULL, password VARCHAR(10) NOT NULL,PRIMARY KEY(id));";
        db.execSQL(sql);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("----版本迭代的时候会使用", "---");
    }
}

这是一个SQLDataBase的管理类,对操作进行管理。db和cursor要及时关闭,否则会导致内存溢出。我只写了sql语句的操作,因为我感觉这个比较简单明了,有sql基础的小伙伴一看便知。

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import example.com.mvpdesign.sqlite.MySQLiteOpenHelper;

/**
 * Created by qiang.lin 
 */
public class DataBaseManager {
    private static final String TAG = DataBaseManager.class.getSimpleName();
    private static DataBaseManager dataBaseManager;
    private MySQLiteOpenHelper mySQLiteOpenHelper;
    private SQLiteDatabase sqLiteDatabase;

    private DataBaseManager(Context context) {
        mySQLiteOpenHelper = new MySQLiteOpenHelper(context.getApplicationContext());
    }

    /**
     * 单例模式
     *
     * @return 对象
     */
    public static DataBaseManager getInstance(Context context) {
        if (dataBaseManager == null) {
            synchronized (DataBaseManager.class) {
                if (dataBaseManager == null) {
                    dataBaseManager = new DataBaseManager(context);
                }
            }
        }
        return dataBaseManager;
    }

    /**
     * 增删改
     *
     * @param sql
     * @param bindArgs 占位符值
     * @return 成功or失败
     */
    public boolean executeSQL(String sql, Object[] bindArgs) {
        sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
        try {
            sqLiteDatabase.execSQL(sql, bindArgs);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        } finally {
            sqLiteDatabase.close();
        }
        return true;
    }

    /**
     * cursor是结果集,查询
     *
     * @param sql
     * @param bindArgs 占位符的值
     */
    public Cursor selectSQL(String sql, String[] bindArgs) {
        sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();
        Cursor cursor = null;
        try {
            cursor = sqLiteDatabase.rawQuery(sql, bindArgs);
            if (cursor != null && cursor.getCount() > 0) {
                return cursor;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        } finally {
            cursor.close();
            sqLiteDatabase.close();
        }
        return null;
    }
}

插入操作

 boolean flag = DataBaseManager.getInstance(SqliteActivity.this).executeSQL("insert into user(id,name,password) values(?,?,?);", new String[]{"1", "李四", "234"});

删除操作

    boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("delete from user where id=? ", new String[]{"1"});

修改操作

  boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("update user set name=? where id=?;", new String[]{"张三", "1"});

查询操作

StringBuffer sb = new StringBuffer();
  Cursor cursor=DataBaseManager.getInstance(SqliteActivity.this).selectSQL("select * from user where id=?;",new String[]{"10"});
   if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex("id"));
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String password = cursor.getString(cursor.getColumnIndex("password"));
                sb.append("id:" + id + "----" + "name:" + name + "------" + "password:" + password);
                Log.i("数据库------", sb.toString());
            }
        }
        cursor.close();

事务,两个或以上的操作相互关联操作,如果其中一个失败了,将会事务回滚,该次操作回到进入时的数据状态,操作失败。

 public void transactionData() {
        sqLiteDatabase.beginTransaction();
        try {
            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"王五", "8"});
            sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"李四", "8"});
                     sqLiteDatabase.setTransactionSuccessful();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sqLiteDatabase.endTransaction();
            sqLiteDatabase.close();
        }

    }

到此SQLite的使用就完成了,其实操作也是很简单的,运行完成后,会在data/data/com.example.项目名/ 生成 一个user.db文件,可以通过shell命令查看,配置adb。也可以用第三方软件导出查看(SQLiteExpert.zip),小编是用该软件打开。后来发现其实在使用虚拟机的时候,虚拟机支持直接代开sqlite文件,所以直接打开就可以看到库表。
如果你的sql基础不是很好,可以试一试用第三方的开源框架,如litepal,该框架小编是在朋友的推荐下看了下,使用起来还是很简单便捷的。
总结:1、感觉Manger管理类设计的不是很合理,如果小伙伴们有更好的设计思路,可以提供给小编。
2、相比于数据库,sqlite的操作还是比较简单便捷的。就是到生成文件找了一会。

你可能感兴趣的:(android,sqlite,数据库,android端)