Android SQLite详解

发布时间:2018-11-17  栏目:sqlite  评论:0 Comments

做Android应用,不可避免的见面与SQLite打交道。随着以的缕缕晋升,原有的数据库结构或早就不复适应新的力量,这时候,就得对SQLite数据库的布局进行提升了。

在品种支出被,我们一点都见面就此到数据库。在Android中,我们一般下SQLite,因为Android在android.database.sqlite保证封装了好多SQLite操作的API。我好写了一个Demo来总结SQLite的使用,托管在Github上,大家好点击下载APK,也可点击下载源码。Demo截图如下:

SQLite提供了ALTER
TABLE命令,允许用户重命名或续加新的字段到已经生表中,但是非克起表中删除字段。

当以SQLite时,我提议事先下充斥一个地面SQLite客户端来证明操作,在地头写的SQL语句运行对后,再转换到Android中。我为此底是SQLite
Expert
Personal。
首先创建一个持续在SQLiteOpenHelper的近乎,并重写onCreate()onUpgrade()方法。

并且只能在表的末段添加字段,比如,为 Subscription添加少单字段:

public class OrderDBHelper extends SQLiteOpenHelper{
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "myTest.db";
    public static final String TABLE_NAME = "Orders";

    public OrderDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);
        String sql = "create table if not exists " + TABLE_NAME + " (Id integer primary key, CustomName text, OrderPrice integer, Country text)";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        sqLiteDatabase.execSQL(sql);
        onCreate(sqLiteDatabase);
    }
}

复制代码 代码如下:

这个看似主要用来建筑数据库及建表用,我们还创一个OrderDao用于拍卖所有的多少操作方法。在OrderDao钟实例化OrderDBHelper:

ALTER TABLE Subscription ADD COLUMN Activation BLOB;
ALTER TABLE Subscription ADD COLUMN Key BLOB;

public OrderDao(Context context) {
    this.context = context;
    ordersDBHelper = new OrderDBHelper(context);
}

此外,如果遇复杂的改动操作,比如当改动的又,需要展开数据的转换,那么可采用以一个事务中推行如下语句来促成修改表的急需。

数据库操作无外乎:“增删查改”。对于“增删改”这好像对发明内容变换的操作,我们需先调用getWritableDatabase(),在履行的时候可以调用通用的execSQL(String sql)主意或者相应的操作API:insert()delete()update()。而对“查”,需要调用getReadableDatabase(),这时就匪可知使用execSQL方法了,得使用query()rawQuery()道。下面开始相继介绍。

1. 以表名改呢临时表

加数据

以本人的Demo中,有点儿种增加多少操作:
初始化数据
当上Demo程序时,先判断表中是否发数量,如果表中从不数量,我用先补加有多少。在初始化数据时,因为一次性要加上的数码比多,所以自己直接以的是execSQL方法:

db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();

db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (1, 'Arc', 100, 'China')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (2, 'Bor', 200, 'USA')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (3, 'Cut', 500, 'Japan')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (4, 'Bor', 300, 'USA')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (5, 'Arc', 600, 'China')");
db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " (Id, CustomName, OrderPrice, Country) values (6, 'Doom', 200, 'China')");

db.setTransactionSuccessful();

栽入一长新数据
咱尚足以用insert(String table,String nullColumnHack,ContentValues values)方法来插入,ContentValues其间贯彻即是HashMap,但是彼此还是时有发生反差的,ContenValues
Key只能是String类型,Value只能存储中心类型的多少,像string,int之类的,不可知储存对象这种事物:

public ContentValues() {
    // Choosing a default size of 8 based on analysis of typical
    // consumption by applications.
    mValues = new HashMap<String, Object>(8);
}

下insert()方法我们插入一漫漫新数据(7, “Jne”, 700,
“China”),对于修改数据的操作我们一般作为事务(Transaction)处理:

db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();

// insert into Orders(Id, CustomName, OrderPrice, Country) values (7, "Jne", 700, "China");
ContentValues contentValues = new ContentValues();
contentValues.put("Id", 7);
contentValues.put("CustomName", "Jne");
contentValues.put("OrderPrice", 700);
contentValues.put("Country", "China");
db.insertOrThrow(OrderDBHelper.TABLE_NAME, null, contentValues);

db.setTransactionSuccessful();

复制代码 代码如下:

抹数据

抹数据的办法除了execSQL还有delete(String table,String whereClause,String[] whereArgs),whereClause是抹条件,whereArgs是去条件值数组。

db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();

// delete from Orders where Id = 7
db.delete(OrderDBHelper.TABLE_NAME, "Id = ?", new String[]{String.valueOf(7)});
db.setTransactionSuccessful();

重拘留去的源码,里面会拼装删除条件与去条件值数组:

public int delete(String table, String whereClause, String[] whereArgs) {
    acquireReference();
    try {
        SQLiteStatement statement =  new SQLiteStatement(this, "DELETE FROM " + table +
                (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
        try {
            return statement.executeUpdateDelete();
        } finally {
            statement.close();
        }
    } finally {
        releaseReference();
    }
}

ALTER TABLE Subscription RENAME TO __temp__Subscription;

改数据

改数据及插数据好相似,调用的计除了execSQL尚足以是update(String table,ContentValues values,String whereClause, String[] whereArgs)

db = ordersDBHelper.getWritableDatabase();
db.beginTransaction();

// update Orders set OrderPrice = 800 where Id = 6
ContentValues cv = new ContentValues();
cv.put("OrderPrice", 800);
db.update(OrderDBHelper.TABLE_NAME,
        cv,
        "Id = ?",
        new String[]{String.valueOf(6)});
db.setTransactionSuccessful();

2. 创办新表

招来数据

招来数据有半点独艺术,一凡public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);,另外一个是public Cursor rawQuery(String sql, String[] selectionArgs)rawQuery的写法类似上面的execSQL,在这不开牵线,query艺术中的参数如下:

  • table:表名称
  • columns:列名称数组
  • selection:条件字句,相当给where
  • selectionArgs:条件字句,参数数组
  • groupBy:分组列
  • having:分组条件
  • orderBy:排序列
  • limit:分页查询范围
  • Cursor:返回值,相当给结果集ResultSet

咱俩可见见返回的种类且是CursorCursor是一个游标接口,提供了遍历查询结果的不二法门,如运动指针方法move(),获得列值方法。Cursor游标常用方法如下:

咱先行来查同一查用户称吧”Bor”的音信:

db = ordersDBHelper.getReadableDatabase();

// select * from Orders where CustomName = 'Bor'
cursor = db.query(OrderDBHelper.TABLE_NAME,
        ORDER_COLUMNS,
        "CustomName = ?",
        new String[] {"Bor"},
        null, null, null);

if (cursor.getCount() > 0) {
    List<Order> orderList = new ArrayList<Order>(cursor.getCount());
    while (cursor.moveToNext()) {
        Order order = parseOrder(cursor);
        orderList.add(order);
    }
    return orderList;
}

自我们呢足以查询总数、最老价值最小值之类的,以询问Country为China的用户总数为条例:

db = ordersDBHelper.getReadableDatabase();
// select count(Id) from Orders where Country = 'China'
cursor = db.query(OrderDBHelper.TABLE_NAME,
        new String[]{"COUNT(Id)"},
        "Country = ?",
        new String[] {"China"},
        null, null, null);

if (cursor.moveToFirst()) {
    count = cursor.getInt(0);
}

从那之后SQLite就介绍完了,大家可以下载Demo翔查看。Demo中还有一部分其他比较干货的物,大家可开掘挖掘。当然Demo中为略不足,我还会见更新,尽量做到让用户通过Demo就能够学会怎么使用SQLite。

复制代码 代码如下:

CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName
VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);

3. 导入数据

复制代码 代码如下:

INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM
__temp__Subscription;

或者

复制代码 代码如下:

INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM
__temp__Subscription;

* 注意 双引号”” 是用来补偿原来不设有的数码的
4. 抹临时表

复制代码 代码如下:

DROP TABLE __temp__Subscription;

经以上四个步骤,就好形成旧数据库结构于新数据库结构的迁,并且其中尚可以保证数据不见面应为提升要没有。

自,如果遇减少字段的情状,也得以由此创办临时表的主意来实现。

公可能感兴趣之稿子:

  • android实现程序自动升级至安装示例分享(下载android程序安装包)
  • Android增量升级之计以及原理详细介绍
  • Android实现创建或者提升数据库时实施语句
  • c#动用xamarin编写拨打电话程序
  • Android编程实现自动检测版本及自动升级的方法
  • Android将Xamarin For
    VS升级为4.1.0.530版教程

留下评论

网站地图xml地图