使用SQLiteOpenHelper操控数据库

上次我使用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 dict 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>

效果:

时间: 2024-10-10 16:08:08

使用SQLiteOpenHelper操控数据库的相关文章

使用 SQLiteOpenHelper 对数据库进行操作

SQLiteOpenHelper 是android提供的一个帮助类,这个类是抽象的,通过实现这个类,可以帮助开发者实现对SQLITE数据库的创建以及数据库版本管理,使用SQLiteOpenHelper打开数据库如果数据库存在则不创建,如果不存在则创建它(此时执行的是onCreate方法). public DatabaseHelper(Context context, String name, CursorFactory factory, int version) 第一个参数:Context类型,

利用SQLiteOpenHelper创建数据库,进行增删改查操作

Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法.onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行. onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前

Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作

一.前言 在手机中进行网络连接不仅是耗时也是耗电的,而耗电却是致命的.所以我们就需要数据库帮助我们存储离线数据,以便在用户未使用网络的情况下也可以能够使用应用的部分功能,而在需要网络连接的功能上采用提示方式,让用户决定是否打开网络.而本节我们将会学习如何访问数据库以及提供基本的增删改查功能,并且使他们尽量的解耦. 二.数据库 Xamarin.Android下创建本地数据库与在Java下的方式相同,而我们必须掌握使用SQLiteOpenHelper,因为这个类会简化我们创建数据的步骤,让我们只需要

Android中使用SQLiteOpenHelper管理SD卡中的数据库

使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases中(可使用Eclispe的DDMS查看). (2)如果无法获取Root权限,则无法直接查看创建的数据库. 鉴于上述限制及实际需要,打算使用SQLiteOpenHelper管理SD卡上的数据库,通过研究SQLiteOpenHelper的源码,发现其创建或打开数据库的代码位于getWritableD

SQLiteDatabase数据库操作详解

今天花了点时间总结了一下数据的相关知识android中系统自带的数据库SQLiteDatabase数据库,这种数据库操作起来比ormLite数据库(第三方的)麻烦点,但是我对这种数据库操作比较熟悉所以我就采用了这种数据库,如有错误欢迎大家批评指正,谢谢 1.SQLiteDatabase SQLiteDatabase本身是一个数据库的操作类,但是如果想进行数据库的操作,还需要android.database.sqlite.SQLiteOpenHelper类的帮助,在执行SQL语句时execSQL(

Android将数据库保存到SD卡的实现

??有时候为了需要,会将数据库保存到外部存储或者SD卡中(对于这种情况可以通过加密数据来避免数据被破解),比如一个应用支持多个数据,每个数据都需要有一个对应的数据库,并且数据库中的信息量特别大时,这显然更应该将数据库保存在外部存储或者SD卡中,因为RAM的大小是有限的:其次在写某些测试程序时将数据库保存在SD卡更方便查看数据库中的内容. ??Android通过SQLiteOpenHelper创建数据库时默认是将数据库保存在'/data/data/应用程序名/databases'目录下的,只需要在

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

数据库知识SQLite

MySQLiteOpenHelper -> SQLiteDatabase import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class AppLockOpenHelper extends SQLiteOpenHelper { //设置数据库的名称版本号 public AppLoc

android数据库版本升级总结

前序: Android版本升级同时Sqlite数据库的升级及之前数据的保留 原理分析: 在android应用程序需要升级时,如果之前的数据库表结构发生了变化或者新添加了表,就需要对数据库进行升级,并保留原来的数据库数据. 程序如何知道数据库需要升级? SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号.比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中. 到了1