当前位置:首页 > 数据库 > SQlite

安卓开发:本地数据库SQLite的使用

上篇文章,讲述了安卓开发中文件存储和SharedPreferences存储方式。这里讲述SQLite数据库存储。我们的通讯录也存在与SQLite数据库中。存放的位置在:/data/data/com.android.providers.contacts/databases/contacts2.db。我们看看该目录的结构
安卓开发:本地数据库SQLite的使用 - 文章图片
.db文件可以用Navicat打开,下载地址:点击下载

我们将该.db文件导出到电脑,然后用Navicat打开:
安卓开发:本地数据库SQLite的使用 - 文章图片
还有很多表。可以自行参考每张表的意义。

SQLite是安卓手机本地数据库,是很轻量的。从上述可以看到,所有的表都可以放在一个.db文件中存储。SQLite也遵循SQL语句,所以使用起来是非常方便的。
和SharedPreferences存储类似的,应用程序生成的.db文件也存在于/data/data/包名/databases目录下。

我们来看看数据库SQLite的使用。首先,安卓提供了SQLiteOpenHepler帮助类,让我们更加方便的使用SQLite。该类是抽象类,我们需要实现它的抽象方法【Oncreate()方法和OnUpgrade()方法】。
OnCreate()方法只会执行一次,在新建数据库的时候调用【即程序关闭后,再运行程序是不会再调用该方法的,主要用于新建数据表】
OnUpgrade()方法用于实现对数据库的升级、更新等操作
继承SQLiteOpenHepler帮助类还需要实现构造函数,需要(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)四个参数。第一个是上下文。第二个是数据库文件的名字【如contacts.db】。第三个是光标工厂。第四个是版本号。特别注意:如果版本号变了,会系统会自动调用OnUpgrade()方法用于更新、修改数据表的结构
SQLiteOpenHepler帮助类还提供了两个很有用的方法。getWritableDatabase()方法:主要用于修改数据库如:增加删除修改等操作。getReadableDatabase()方法:主要用于查询数据库

1、新建数据库:
我们先继承SQLiteOpenHepler帮助类:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private Context context;
    private String username = "create table username("
            + "id integer primary key autoincrement, "
            + "username varchar(255) )";
    private String password = "create table password("
            + "id integer primary key autoincrement, "
            + "password varchar(255) )";

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context = context;
    }
	
	// 新建数据库,只会调用一次
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(username);
        db.execSQL(password);
    }

    // 用于更新数据库
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

代码很简单,就是定义了两个字符串【username和password,用于新建数据表】。

在MainActivity.java中:

public class MainActivity extends Activity {
    private MySQLiteOpenHelper mySQLiteOpenHelper;
    private SQLiteDatabase readableDatabase;
    private SQLiteDatabase writableDatabase;

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

        mySQLiteOpenHelper = new MySQLiteOpenHelper(this, "myapplication.db", null, 1);
        mySQLiteOpenHelper.getWritableDatabase();

        writableDatabase = mySQLiteOpenHelper.getWritableDatabase();
        readableDatabase = mySQLiteOpenHelper.getReadableDatabase();
    }
}

主要新建了MySQLiteOpenHelper实例,就会调用MySQLiteOpenHelper类中的onCreate()方法,新建数据库。
程序运行后,我们可以看看应用程序目录下的数据库:
安卓开发:本地数据库SQLite的使用 - 文章图片
果然,多了myapplication.db文件。用Navicat打开该db文件:
安卓开发:本地数据库SQLite的使用 - 文章图片
新建数据库就完成了。

2、更新数据库
我们如果再运行该app,数据库是不会再新建的。但是如果我们需要对数据库的结构进行修改怎么办呢?
可以看到MySQLiteOpenHelper帮助类中onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)抽象方法有oldversion和newversion两个参数。我们只要在产生MySQLiteOpenHelper实例的时候mySQLiteOpenHelper = new MySQLiteOpenHelper(this, "myapplication.db", null, 1)将1改成2,程序就会调用onUpgrade()方法。

3、增加数据
有两种方法,一种是用CRUD操作:

writableDatabase.execSQL("insert into password values(null, ?)", new String[]{"Aiden"});

还有一种是安卓提供的api:

ContentValues contentValues = new ContentValues();
contentValues.put("username", "Aiden");
writableDatabase.insert("username", null, contentValues);

这两种方法都是可以放置SQL注入的。

4、修改操作

ContentValues contentValues = new ContentValues();
contentValues.put("username", "Aiden1");
writableDatabase.update("username", contentValues, "username = ?", new String[] {"Aiden"});

writableDatabase.execSQL("update password set password = ? where id = ?", new Object[]{"Aiden1", 1});

经过上述步骤,数据表username的Aiden变成了Aiden1,password表中的Aiden也变成了Aiden1

5、删除操作

writableDatabase.delete("username", "id = ?", new String[]{"1"});

writableDatabase.execSQL("delete from  password where id = ?", new Object[]{1});

这样就把username表中id为1和password表中id为1的数据都删除了。

6、查询操作
查询操作应该算是“最难”的了。
这里操作多表查询的例子

Cursor cursor = readableDatabase.rawQuery("select * from username, password where username.id = password.id and username.id = ?", new String[]{"3"});
	while(cursor.moveToNext()) {
	    String username = cursor.getString(cursor.getColumnIndex("username"));
        String password = cursor.getString(cursor.getColumnIndex("password"));
}

这样就取到了username的id为3,password的id为3的数据项了。


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!