上篇文章,讲述了安卓开发中文件存储和SharedPreferences存储方式。这里讲述SQLite数据库存储。我们的通讯录也存在与SQLite数据库中。存放的位置在:/data/data/com.android.providers.contacts/databases/contacts2.db。我们看看该目录的结构

.db文件可以用Navicat打开,下载地址:点击下载
我们将该.db文件导出到电脑,然后用Navicat打开:

还有很多表。可以自行参考每张表的意义。
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()方法,新建数据库。
程序运行后,我们可以看看应用程序目录下的数据库:

果然,多了myapplication.db文件。用Navicat打开该db文件:

新建数据库就完成了。
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)!