Android下最好的数据储存方式:关系型数据库sqlite。
数据库的创建:使用SqliteOpenHelper类
结合SqliteOpenHelper类和SQLiteDatabase类的帮助,我们可以方便地对数据库进行CURD操作。
数据库的创建:
我们主要通过在SqliteOpenHelper类的onCreate方法中创建数据库表。
那么,onCreate方法又是在什么时候执行的呢?
我们先写一下代码:
package com.whathecode.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper
{
public static final String CREATE_TABLE = "create table student("
+ "id integer primary key," + "age integer," + "name char(20))";
public DatabaseHelper(Context context)
{
super(context, "dbsample.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
通过上面的代码,我们可以创建一个dbsample.db的数据库。
实际上,当我们通过new关键字创建这个类的实例的时候,数据库文件并没有被创建出来。
事实上是,数据库是我们第一次连接的时候创建的。
亦即是通过SqliteOpenHelper的getReadableDatabase()方法或者getWritableDatabase方法的时候创建。
SqliteOpenHelper的onCreate方法也是在这个时候执行。
因此,我们可以在onCreate方法中创建需要的表。
下面是MainActivity的代码:
package com.whathecode.sqlitedemo;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import com.whathecode.db.DatabaseHelper;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//执行到这行的时候数据库没有被创建
DatabaseHelper dbh = new DatabaseHelper(this);
//当执行到这行的时候数据被被创建出来
SQLiteDatabase readableDatabase = dbh.getReadableDatabase();
}
}
创建好数据库后,我们就可以对数据库进行CURD操作。
向数据库中插入数据:
使用SQLiteDatabase类中execSQL的方法,我们可以方便地操作数据库:
注意getReadableDatabase返回的数据库对象是只读的。
现在我们需要写入数据库,就需要调用getWritableDatabase方法
更新后的MainActivity代码:
package com.whathecode.sqlitedemo;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.whathecode.db.DatabaseHelper;
public class MainActivity extends Activity
{
SQLiteDatabase readableDatabase = null;
DatabaseHelper dbh = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//执行到这行的时候数据库没有被创建
dbh = new DatabaseHelper(this);
//当执行到这行的时候数据被被创建出来
readableDatabase = dbh.getReadableDatabase();
}
public void insertData(View view)
{
SQLiteDatabase writableDatabase = dbh.getWritableDatabase();
if (writableDatabase.isOpen())
{
for (int i = 0; i < 20; i++)
{
//执行数据插入操作
writableDatabase.execSQL("insert into student values(?,?,?);",
new Object[] { i + 2, 10 + i, "android " + i });
}
writableDatabase.close();
Toast.makeText(this, "数据插入成功", Toast.LENGTH_SHORT).show();
}
}
}
看一下运行结果:
现在,我们使用sqlite3工具看看数据是否真的被插入了
看到了吧,数据一条不少被插入了.
SqliteDatabase类除了execSQL方法外还有其他的方法可以操作数据库:
- create(SQLiteDatabase.CursorFactory factory)
- delete(String table, String whereClause, String[] whereArgs)
- query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
- rawQuery(String sql, String[] selectionArgs)
当使用execSQL执行任何的查詢语句都是没有返回结果的。
如果想返回结果,就要使用rawQuery方法。
当然,上面这些只是部分方法,其他的大家可以到官网查看API
其他的数据库查找,更新,删除操作都只是依瓢画葫芦。大家可以自行研究一下。