上次我使用SQLiteDatabase来操作数据库,但更常见的是使用SQLiteDatabase来操作SQLite.
一般的用法是创建SQLiteOPenHelper的子类,扩展它的onCreatea(SQLiteDatabase db) 和 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法。
Synchronized SQLiteDatabase getReadableDatabase()
-->以读写的方式打开数据库对应的SQLiteDatabase对象。
Synchronized SQLiteDatabase getWritableDatabase()
-->以写的方式打开数据库对应的SQLiteDatabase对象。
abstract void onCreate(SQLiteDatabase db)
-->第一次创建数据库时,回调该方法。
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
-->当数据库版本更新时,回调该方法。
Synchronized void close()
-->关闭所有打开的数据库。
得到SQLiteDatabase对象后,就 不需用SQLiteDatabase的静态方法创建SQLiteDatabase对象,而可以用getWritableDatabase()或getReadableDatabase()方法来获取一个SQLiteDatabase对象。
当数据库的磁盘空间满了时, 数据库就只能读,不能写, 而 getWritableDatabase()以读写方式打开数据库,此时用getWritableDatabase()打开数据库会出错。
getReadableDatabase()先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,但失败后会继续尝试以只读的方式打开数据库。
当然,说那么多废话,还不如代码来的爽快。
自定义MyDatabaseHelper
--MyDatabaseHelper.java
public class MyDatabaseHelper extends SQLiteOpenHelper {
final String CREATE_TABLE = "create table dict(_id integer primary key autoincrement, word, detail)";
public MyDatabaseHelper(Context context, String name, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
---Main.java
public class Main extends Activity {
MyDatabaseHelper dbHelper;
EditText editText1 ,editText2, editText3;
Button insert, search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//此处使用相对路径,数据库文件自动保存在程序的数据库文件的database目录下
dbHelper = new MyDatabaseHelper(this, "mydict.db3", 1);
editText1 = (EditText) findViewById(R.id.editText1);
editText2 = (EditText) findViewById(R.id.editText2);
editText3 = (EditText) findViewById(R.id.editText3);
insert = (Button) findViewById(R.id.button1);
search = (Button) findViewById(R.id.button2);
insert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
insertIntoDatabase(dbHelper.getReadableDatabase(), editText1.getText().toString(),editText2.getText().toString());
Toast.makeText(Main.this, "插入成功", Toast.LENGTH_SHORT).show();
}
});
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String key = editText3.getText().toString();
if(key.equals("")||key==null)
return;
Cursor cursor = dbHelper.getReadableDatabase().rawQuery("select * from mydict where word like ? or detail like ?",
new String[]{"%"+key+"%", "%"+key+"%"});
Bundle bundle = new Bundle();
bundle.putSerializable("data", converCursorToList(cursor));
Intent intent = new Intent(Main.this, ResultDict.class);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
protected ArrayList<Map<String, String>> converCursorToList(Cursor cursor){
ArrayList<Map<String, String>> result = new ArrayList<Map<String,String>>();
while(cursor.moveToNext()){
Map<String, String> map = new HashMap<String, String>();
map.put("word", cursor.getString(1));
map.put("detail", cursor.getString(2));
result.add(map);
}
return result;
}
private void insertIntoDatabase(SQLiteDatabase db, String word, String detail){
db.execSQL("insert into dict values(null, ?, ?)", new String[]{word, detail});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(dbHelper!=null){
dbHelper.close();
}
}
}
--ResultDict.java
public class ResultDict extends Activity {
ListView listView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.resultdict);
listView = (ListView) findViewById(R.id.listView1);
Intent intent = getIntent();
Bundle bundle=intent.getExtras();
@SuppressWarnings("unchecked")
List<Map<String, String>> list = (List<Map<String, String>>) bundle.getSerializable("data");
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item,
new String[]{"word", "detail"}, new int[]{R.id.textView_2, R.id.textView_4} );
listView.setAdapter(adapter);
}
}
主布局文件:
--main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:ems="10" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editText1"
android:ems="10" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editText2"
android:layout_marginTop="80dp"
android:text="添加单词" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/button1"
android:layout_marginTop="80dp"
android:text="查找" />
<EditText
android:id="@+id/editText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/button1"
android:layout_marginTop="45dp"
android:ems="10" />
</RelativeLayout>
--resultdict.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ListView
android:id="@+id/listView1"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</RelativeLayout>
--item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单词" />
<TextView
android:id="@+id/textView_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/textView_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解释" />
<TextView
android:id="@+id/textView_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
效果: