android string转int_57、Android持久化存储之SQLITE数据库

14b383ca386378044c99428390126917.png

SQLiteDatabase是Android提供的用来管理Sqlite database的一种数据持久化解决方案。SQLiteDatabase提供了基本的增删改查方法,可以执行SQL命令,执行其他常见数据库管理任务的方法。

android提供SQLiteOpenHelper类,继承抽象类实现其必须实现的抽象方法。

1、SQLiteOpenHelper提供3个构造方法重写

public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {        super(context, name, factory, version, errorHandler);    }    @RequiresApi(api = Build.VERSION_CODES.P)    public Db(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {        super(context, name, version, openParams);    }

常用4个参数:第一个Context 上下文this对象,第二个数据库名称,第三个允许查询返回一个自定义cursor,传入null,第四个数据版本主要结合 onUpgrade 进行数据库版本升级。

2、创建表

public void onCreate(SQLiteDatabase db) 

3、数据库升级

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

下面举例了sqlite的基本使用,代码例子如下:

/** * 数据库操作 */public class Db extends SQLiteOpenHelper {    private SQLiteDatabase currentDB = null;    public Db(@Nullable Context context){        this(context,"testdata",null,1);    }    public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {        super(context, name, factory, version, errorHandler);    }    @RequiresApi(api = Build.VERSION_CODES.P)    public Db(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {        super(context, name, version, openParams);    }    //创建数据库    @Override    public void onCreate(SQLiteDatabase db) {        this.currentDB = db;        String sql = "CREATE TABLE IF NOT EXISTS "                + "student ( "                + " id INTEGER PRIMARY KEY AUTOINCREMENT, "                + "name TEXT,"                + "gender INTEGER, "                + "number TEXT, "                + "score INTEGER)";        db.execSQL(sql);    }    /**     * 删除所有表     */    public synchronized void dropAllTables() {        SQLiteDatabase db = this.getWritableDatabase();        if (db == null)            return;        Cursor cur = db.query("sqlite_master", new String[] { "name" }, "type='table'", null, null, null, null);        while (cur.moveToNext()) {            String name = cur.getString(0);            if (name.equals("android_metadata"))                continue;            db.execSQL("DROP TABLE IF EXISTS " + name);        }        // db.close();    }    /**     *  删除单个表     *     * @param tableName     * @return     */    public synchronized int dropTable(String tableName) {        if (tableName != null) {            SQLiteDatabase db = this.getWritableDatabase();            db.execSQL("DROP TABLE IF EXISTS " + tableName);            db.close();            return 1;        }        return 0;    }    /**     * 数据库版本更新     * @param db     * @param oldVersion     * @param newVersion     */    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        this.currentDB = db;        if (oldVersion < newVersion) {            dropAllTables();//删除之前的表 重新建表            onCreate(db);        }    }    @Override    public SQLiteDatabase getWritableDatabase() {        // TODO Auto-generated method stub        if (currentDB != null) {            return currentDB;        }        return super.getWritableDatabase();    }    /**     * 数据的删除     */    public synchronized void delete(String tableName,String where ,String[] whereArgs) {        try {            SQLiteDatabase db = this.getWritableDatabase();            db.delete(tableName, where, whereArgs);            db.close();        } catch (Exception ex) {        }    }    public synchronized void delete2(String tableName, String where) {        try {            SQLiteDatabase db = this.getWritableDatabase();            db.delete(tableName, where,null);            db.close();        } catch (Exception ex) {        }    }    public void updateData(String sql) {        SQLiteDatabase db = this.getWritableDatabase();        db.execSQL( sql );    }    /**     * 插入数据     *     * @param t     * @return     */    public synchronized long insert(String tableName, Map map) {        SQLiteDatabase db = this.getWritableDatabase();        ContentValues contentValues = new ContentValues();        //contentValues.put("id",(int)map.get("id"));        contentValues.put("name",(String)map.get("name"));        contentValues.put("gender",(int)map.get("gender"));        contentValues.put("number",(String)map.get("number"));        contentValues.put("score",(int)map.get("score"));        //db.insertWithOnConflict(tableName,null,contentValues,SQLiteDatabase.CONFLICT_IGNORE);        long insertid = db.replace(tableName, null, contentValues);        db.close();        return insertid;    }    /**     * 查询     * 这里直接返回游标,如果想抽象公用,直接使用反射注解等方法解析     */    public synchronized Cursor query(String tableName,String where,String order,int start,int count ){        SQLiteDatabase db = this.getWritableDatabase();        Cursor cursor = db.query(tableName, null, where, new String[] {}, null, null, order,start+","+count);        //cursor = db.rawQuery("select *   from TableSong where Words=?",new String[]{"6"}  );        return cursor;    }}

使用方法如下:

Db db = new Db(this);        //插入数据        Map map = new HashMap();        map.put("name","xiaobai");        map.put("gender",1);        map.put("number","187677666");        map.put("score",90);        long id = db.insert("student",map );        Log.e( "ProcessBar","id="+id);

我们插入一条数据,并打开数据库看是否成功。

4327811605a7f85893c1492cff386d20.png

数据库地址/data/data/包名/databases/*

从模拟器下载数据库,用sqlite studio 工具打开数据库:

d558e0a206388b1eeb0e7f056fc63672.png

修改数据库:

//修改数据  把id=1 的 name字段修改为 张三db.updateData("update student  set name = \"张三\" where id = 1  ");

查询数据:

//查询        Cursor cursor = db.query("student",null,null,0,10);        while (cursor != null && cursor.moveToNext()) {            Log.e("ProcessBar","queryData student = " + cursor.getInt(cursor.getColumnIndex("id" ) )            +";"+cursor.getString(cursor.getColumnIndex("name" )) );        }

结果:

4bc29d3c97480488799c147149edcbd5.png

根据条件删除数据:

 //方式一        //db.delete("student","name=?",new String[]{"xiaobai"});        //方式2        db.delete2("student","id=25");

SQLite事务

SQLite默认会为每个插入、更新操作创建一个事务,并且在每次插入、更新后立刻提交。如果连续插入n次数据,就会重复执行n次创建事务->执行语句->提交操作。如果主动创建事务,那么这个过成就被优化为创建事务->执行n条语句->提交操作,创建事务和提交操作只执行了一次,可以使性能大幅提高。数据库事务代码如下:

 //事务开始        database.beginTransaction();        try {            //执行操作语句            ...                        //事务成功            database.setTransactionSuccessful();        } catch (Exception e) {            e.printStackTrace();        } finally {            //事务结束            database.endTransaction();        }

重要说明:

SQLiteOpenHelper中有两个非常重要的实例方法,getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值