首页 > 程序开发 > 移动开发 > Android >

Android[中级教程]第三章 数据存储之SQLite

2011-10-04

这一章我们来学习Android数据库SQLite,还是接上一章的,对于唐僧师徙去西天,三个徙弟得要杀妖怪啊,那得有个汇总啊,有个记数啊,这里我们就用SQLite来存储各徙弟杀死妖怪的数量,OK,上main.xml<?xml version="1.0" ...

这一章我们来学习Android数据库SQLite,还是接上一章的,对于唐僧师徙去西天,三个徙弟得要杀妖怪啊,那得有个汇总啊,有个记数啊,这里我们就用SQLite来存储各徙弟杀死妖怪的数量,OK,上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="match_parent"

android:layout_height="match_parent">

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="西游记各主人公杀死妖怪数"

android:id="@+id/textView1"></TextView>

<Button android:text="增加一个主角" android:id="@+id/add_btn"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="更新主角杀死妖怪数" android:id="@+id/update_btn"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="删除一个主角" android:id="@+id/del_btn"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<ListView android:layout_height="wrap_content" android:id="@+id/listView1"

android:layout_width="match_parent"></ListView>

</LinearLayout>

这里定义了三个按钮,一个ListView,接下来又定义了三个Layout,分别显示"增加一个主角","更新主角杀死妖怪数","删除一个主角"的页面,分别如下:

add_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent" android:padding="10dp">

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="主角名称"></TextView>

<EditText android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/add_name">

<requestFocus></requestFocus>

</EditText>

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="杀死妖怪数量"></TextView>

<EditText android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/add_number"

android:inputType="number"></EditText>

</LinearLayout>

update_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent" android:padding="10dp">

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="ID"></TextView>

<EditText android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/update_id"

android:inputType="number">

<requestFocus></requestFocus>

</EditText>

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="杀死妖怪数量"></TextView>

<EditText android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/update_number"

android:inputType="number"></EditText>

</LinearLayout>

delete_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent" android:padding="10dp">

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="ID"></TextView>

<EditText android:layout_height="wrap_content"

android:layout_width="match_parent" android:id="@+id/delete_id"

android:inputType="number">

<requestFocus></requestFocus>

</EditText>

</LinearLayout>

最后再定义一个List_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent">

<LinearLayout android:layout_height="wrap_content"

android:id="@+id/linearLayout1" android:layout_width="match_parent">

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="ID: "

android:paddingLeft="10dp"></TextView>

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="TextView"

android:id="@+id/id"></TextView>

<TextView android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:layout_width="wrap_content" android:text="TextView"

android:id="@+id/name" android:paddingLeft="30dp"></TextView>

</LinearLayout>

<LinearLayout android:layout_height="wrap_content"

android:id="@+id/linearLayout2" android:layout_width="match_parent">

<TextView android:layout_height="wrap_content"

android:layout_width="wrap_content" android:text="杀死了"

android:paddingLeft="10dp"></TextView>

<TextView android:text="TextView" android:id="@+id/number"

android:layout_width="wrap_content" android:layout_height="wrap_content"

android:textColor="#FF0000"></TextView>

<TextView android:text="只妖怪" android:layout_width="wrap_content"

android:layout_height="wrap_content"></TextView>

</LinearLayout>

</LinearLayout>

OK,定义完了,,我们就来创建数据库了,创建一个DatabaseHelper.java

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper

{

//数据库名称

private static final String DB_NAME = "SQLiteDemo.db";

//数据库版本

private static final int DB_VERSION = 1;

//表名

public static final String TABLE_NAME = "demo";

private static final String DB_CREATE = "create table " + TABLE_NAME + " (_id integer primary key autoincrement, name varchar(20), number varchar(10))";

public DatabaseHelper(Context context)

{

super(context, DB_NAME, null, DB_VERSION);

}

/**

* 创建表

*/

@Override

public void onCreate(SQLiteDatabase db)

{

db.execSQL(DB_CREATE);

}

/**

* 更新表

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

// db.execSQL("drop table if exists " + TABLE_NAME);

// onCreate(db);

}

}

另外再创建一个数据库操作辅助类DatabaseServer.java

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

public class DatabaseServer

{

private DatabaseHelper dbHelper;

public DatabaseServer(Context context)

{

this.dbHelper = new DatabaseHelper(context);

}

/**

* 插入数据

*

* @param name

* 名字

* @param number

* 数据

* @return 如果成功则返回true,否则返回false

*/

public boolean insert(String name, String number)

{

//创建或打开数据库

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues cv = new ContentValues();

cv.put("name", name);

cv.put("number", number);

//插入数据,返回插入数据ID

long id = db.insert(dbHelper.TABLE_NAME, null, cv);

if (id != 0)

{

return true;

}

return false;

}

/**

* 更新数据

*

* @param id

* 数据列_id

* @param number

* 数量

* @return 如果成功则返回true,否则返回false

*/

public boolean update(int id, String number)

{

SQLiteDatabase db = dbHelper.getWritableDatabase();

//Android自带的ContetValues,类似于Map,提供了put(String key, XXX value)的方法存入数据

ContentValues cv = new ContentValues();

cv.put("number", number);

//通过ContentValues更新数据表,返回更新的ID值

int result = db.update(dbHelper.TABLE_NAME, cv, "_id=?",

new String[] { String.valueOf(id) });

if (result != 0)

{

return true;

}

return false;

}

/**

* 删除数据

*

* @param id

* 数据列_id

* @return

*/

public boolean delete(int id)

{

SQLiteDatabase db = dbHelper.getWritableDatabase();

//删除指定ID值

int result = db.delete(dbHelper.TABLE_NAME, "_id=?",

new String[] { String.valueOf(id) });

if (result != 0)

{

return true;

}

return false;

}

/**

* 查询数据

*

* @return 返回数据列表

*/

public Cursor fetchAll()

{

SQLiteDatabase db = dbHelper.getReadableDatabase();

//查询数据表中所有字段

Cursor cursor = db.query(dbHelper.TABLE_NAME, null, null, null, null,

null, "_id desc");

if (cursor != null)

{

return cursor;

}

return null;

}

}

这里将插入,更新,删除,查询分别做了简单的封装,OK,最后就是Activity类了

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.database.Cursor;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleCursorAdapter;

import android.widget.Toast;

public class SQLiteDemo extends Activity implements OnClickListener

{

private Button add_btn;

private Button update_btn;

private Button del_btn;

private ListView listView;

private DatabaseServer dbServer;

@Override

protected void onCreate(Bundle savedInstanceState)

{

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.sqlite);

add_btn = (Button) findViewById(R.id.add_btn);

add_btn.setOnClickListener(this);

update_btn = (Button) findViewById(R.id.update_btn);

update_btn.setOnClickListener(this);

del_btn = (Button) findViewById(R.id.del_btn);

del_btn.setOnClickListener(this);

listView = (ListView) findViewById(R.id.listView1);

dbServer = new DatabaseServer(this);

//自定义方法

SetInAdapter();

}

/**

* 将数据库里查询到的数据匹配进ListView中

*/

private void SetInAdapter()

{

Cursor cursor = dbServer.fetchAll();

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,

R.layout.list_item, cursor, new String[] { "_id", "name",

"number" },

new int[] { R.id.id, R.id.name, R.id.number });

listView.setAdapter(adapter);

}

@Override

public void onClick(View v)

{

switch (v.getId())

{

case R.id.add_btn:

//数据插入

data_add();

break;

case R.id.update_btn:

//数据更新

data_update();

break;

case R.id.del_btn:

//数据删除

data_delete();

break;

}

}

/**

* 删除主角

*/

private void data_delete()

{

//通过扩展,将delete_item.xml放入视图中

final View delete_view = LayoutInflater.from(this).inflate(R.layout.delete_item, null);

AlertDialog.Builder dialog = new AlertDialog.Builder(this);

dialog.setTitle("删除主角");

//设置显示视图为delete_item.xml

dialog.setView(delete_view);

dialog.setPositiveButton("确定", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

//取得delete_item.xml中的EditText控件

EditText delete_id = (EditText)delete_view.findViewById(R.id.delete_id);

//取得输入的ID值

int id = Integer.parseInt(delete_id.getText().toString());

//调用数据库辅助类中的删除数据方法

boolean flag = dbServer.delete(id);

if(flag){

showToast("主角删除成功");

}else{

showToast("主角删除失败");

}

dialog.dismiss();

//调用自定义方法更新ListView

SetInAdapter();

}

});

dialog.setNegativeButton("取消", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

//对话框取消

dialog.dismiss();

}

});

dialog.show();

}

/**

* 更新主角杀死妖怪数

*/

private void data_update()

{

//同上

final View update_view = LayoutInflater.from(this).inflate(R.layout.update_item, null);

AlertDialog.Builder dialog = new AlertDialog.Builder(this);

dialog.setTitle("更新主角杀死ID数");

dialog.setView(update_view);

dialog.setPositiveButton("确定", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

EditText update_id = (EditText)update_view.findViewById(R.id.update_id);

int id =Integer.parseInt(update_id.getText().toString());

EditText update_number = (EditText)update_view.findViewById(R.id.update_number);

String number_str = update_number.getText().toString();

boolean flag = dbServer.update(id, number_str);

if(flag){

showToast("主角数据更新成功");

}else{

showToast("主角数据更新失败");

}

dialog.dismiss();

SetInAdapter();

}

});

dialog.setNegativeButton("取消", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

dialog.dismiss();

}

});

dialog.show();

}

/**

* 增加一个主角方法

*/

private void data_add()

{

//同上

final View add_view = LayoutInflater.from(this).inflate(R.layout.add_item, null);

AlertDialog.Builder dialog = new AlertDialog.Builder(this);

dialog.setTitle("增加一个主角");

dialog.setView(add_view);

dialog.setPositiveButton("确定", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

EditText add_name = (EditText)add_view.findViewById(R.id.add_name);

String name_str = add_name.getText().toString();

EditText add_number = (EditText)add_view.findViewById(R.id.add_number);

String number_str = add_number.getText().toString();

boolean flag = dbServer.insert(name_str, number_str);

if(flag){

showToast("主角增加成功");

}else{

showToast("主角增加失败");

}

dialog.dismiss();

SetInAdapter();

}

});

dialog.setNegativeButton("取消", new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface dialog, int which)

{

dialog.dismiss();

}

});

dialog.show();

}

/*

* 按指定内容显示Toast

*/

protected void showToast(String string)

{

Toast.makeText(this, string, 1).show();

}

}

这里有点长,希望大家能够看完,其实不是太难,这里上图:


\

\

\


\

下一章我们将介绍Android中的单元测试TestCase,谢谢,如果哪位同学想要源码的,请留邮箱,我会及时给你发过去.

摘自:kangkangz4的专栏

相关文章
最新文章
热点推荐