初学Android,数据存储之使用SQLite数据库(四十六)

来源:互联网 发布:西安交大acca知乎 编辑:程序博客网 时间:2024/05/17 06:45

SQLiteOpenHelper是Android提供的一个管理sqlite数据库的一个工具类

主要用于创建一个数据库,并对数据库的版本进行管理。此类为一抽象类,使用是需要继承此类并实现该类的方法 
onCreate(SQLiteDatabase):在数据库第一次生产的时候会调用这个方法,一般我们在这个方法里边生产数据库表。 
onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据库表,并建立新的数据库表,当然是否还需要做其他的操作,完全取决于应用程序的需求。 
onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。 

当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生产一个数据库。数据库使用完后记得调用close()方法关闭数据库。 

下面是一个生词本程序例子,前台输入一些生词,存入数据库,然后再把它查询出来



line.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><EditText android:id="@+id/word"android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="120px"android:editable="false"/><TextView  android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="@string/detail"/><EditText  android:id="@+id/detail"android:layout_width="fill_parent" android:layout_height="wrap_content"android:editable="false"android:lines="3"/></LinearLayout>
popup.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"><ImageView android:layout_width="fill_parent" android:layout_height="wrap_content"android:src="@drawable/line" /><ListView android:id="@+id/show"android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>
main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><EditText android:id="@+id/word"android:layout_width="fill_parent" android:layout_height="wrap_content" /><EditText  android:id="@+id/detail"android:layout_width="fill_parent" android:layout_height="wrap_content" android:lines="3"/><Button  android:id="@+id/insert"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/insert"/><EditText  android:id="@+id/key"android:layout_width="fill_parent" android:layout_height="wrap_content" /><Button  android:id="@+id/search"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/search"/><ListView android:id="@+id/show"android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>
继承SQLiteOpenHelper

package WangLi.IO.DataBaseHelper;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MyDatabaseHelper extends SQLiteOpenHelper{final String CREATE_TABLE_SQL ="create table dict(_id integer primary key autoincrement , word , detail)";public MyDatabaseHelper(Context context, String name, int version){super(context, name, null, version);}@Overridepublic void onCreate(SQLiteDatabase db){// 第一个使用数据库时自动建表db.execSQL(CREATE_TABLE_SQL);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){System.out.println("--------onUpdate Called--------" + oldVersion + "--->" + newVersion);}}
显示查询到结果的窗体

package WangLi.IO.DataBaseHelper;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter;public class ResultActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.popup);ListView listView = (ListView)findViewById(R.id.show);Intent intent = getIntent();//获取该intent所携带的数据Bundle data = intent.getExtras();//从Bundle数据包中取出数据@SuppressWarnings("unchecked")List<Map<String , String>> list = (List<Map<String , String>>)data.getSerializable("data");//将List封装成SimpleAdapterSimpleAdapter adapter = new SimpleAdapter(ResultActivity.this , list, R.layout.line , new String[]{"word" , "detail"}, new int[]{R.id.word , R.id.detail});//填充ListViewlistView.setAdapter(adapter);}}
主界面

package WangLi.IO.DataBaseHelper;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class Dict extends Activity {MyDatabaseHelper dbHelper;Button insert = null;Button search = null;protected ArrayList<Map<String,String>> convertCursorToList(Cursor cursor){ArrayList<Map<String,String>> result = new ArrayList<Map<String,String>>();//遍历Cursor结果集while(cursor.moveToNext()){//将结果集中的数据存入ArrayList中Map<String,String> map = new HashMap<String,String>();//取出查询记录中第2列,第3列的值map.put("word", cursor.getString(1));map.put("detail", cursor.getString(2));result.add(map);}return result;}private void insertData(SQLiteDatabase db,String word,String detail){//执行插入语句db.execSQL("insert into dict values(null , ? , ?)", new String[]{word , detail});}    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //创建MyDatabaseHelper对象,指定数据库版本为1,此处使用相对路径即可        //数据库存文件会自动保存在程序的数据文件夹的databases目录下        dbHelper = new MyDatabaseHelper(this, "myDict.db3" , 1);        insert = (Button)findViewById(R.id.insert);        search = (Button)findViewById(R.id.search);        insert.setOnClickListener(new OnClickListener(){        public void onClick(View source)        {        //获取用户输入        String word = ((EditText)findViewById(R.id.word)).getText().toString();        String detail = ((EditText)findViewById(R.id.detail)).getText().toString();        //插入生词本记录        insertData(dbHelper.getReadableDatabase(), word, detail);        //显示提示信息        Toast.makeText(Dict.this, "添加生词本成功", 8000).show();        }        });        search.setOnClickListener(new OnClickListener(){        public void onClick(View source)        {        //获取用户输入        String key = ((EditText)findViewById(R.id.key)).getText().toString();        //执行查询        Cursor cursor = dbHelper.getReadableDatabase().rawQuery(        "select * from dict where word like ? or detail like ?",         new String[]{"%" + key + "%","%" + key + "%"});        //创建一个Bundler对象        Bundle data = new Bundle();        data.putSerializable("data", convertCursorToList(cursor));        //创建一个Intent        Intent intent = new Intent(Dict.this, ResultActivity.class);        intent.putExtras(data);        //启动Activity        startActivity(intent);        }        });    }        public void onDestroy()    {    super.onDestroy();    //退出程序时关闭MyDatabaseHelper里的SQLiteDatabase    if(dbHelper != null)    {    dbHelper.close();    }    }}

用数据库查询工具看看刚刚插入记录