现在的位置: 首页 > 综合 > 正文

android–数据库简介

2017年12月03日 ⁄ 综合 ⁄ 共 6659字 ⁄ 字号 评论关闭

android--数据库简介

       Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类就是SQLiteOpenHelper类。但是这个类是一个抽象类,不能直接拿来用,需要我们

写一个具体的类来实现它。在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个 方法。

onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。

onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。

另外,对于数据库的一些常量,比如建表语句以及数据库名称、表名称,我们最好用一个类将它们写在一起。

如下是一个常量类:

package com.my.database;

import java.util.ArrayList;

public class TableDefine {
	/**
	 * 数据库名
	 */
	public static final String DB_NAME = "db_my_app";
	/**
	 * 数据库版本
	 */
	public static final int DB_VERSION = 1;

	/**
	 * 用户表
	 */
	public static final String T_USER_NAME = "mUser";
	public static final String COLUMN_ID = "user_id";
	public static final String COLUMN_Name = "user_name";
	public static final String COLUMN_PWD = "pwd";
	public static final String COLUMN_EMAIL = "email";

	/**
	 * 创建用户表的语句
	 */
	public static final String CREATE_TABLE_USER = new StringBuffer()
			.append("Create table ")
			.append(T_USER_NAME)
			.append(" (")
			.append(TableDefine.COLUMN_ID)
			.append(" integer primary key,")
			.append(COLUMN_Name)
			.append(" text not null,")
			.append(COLUMN_PWD)
			.append(" text not null,")
			.append(COLUMN_EMAIL)
			.append(" text not null)")
			.toString();

	/**
	 * 返回建表语句
	 * 
	 * @return
	 */
	public static ArrayList<String> getCreateTableSql() {
		ArrayList<String> list = new ArrayList<String>();
		list.add(CREATE_TABLE_USER);
		return list;
	}

}

我们还需要一个实现SQLiteOpenHelper的类

package com.my.database;

import java.util.ArrayList;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;


public class MySQLiteHelper extends SQLiteOpenHelper {

	private final ArrayList<String> createTableSql;
	
	public MySQLiteHelper(Context context, String dbname, CursorFactory factory,
			int version, ArrayList<String> createTableSql) {
		super(context, dbname, factory, version);
		this.createTableSql = createTableSql;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		if (createTableSql != null && createTableSql.size() > 0) {
			for (String sql : createTableSql) {
				db.execSQL(sql);
			}
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}
	
}

这个类使用了上面的常量类的定义,最终产生了具体的数据库。

最后是一个CRUD的使用类:

package com.my.database;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.my.database.entity.User;

public class DBUtils {
	
	private MySQLiteHelper dbManager;
	private SQLiteDatabase dbInstence;
	
	public DBUtils (Context context) {
		if(dbManager == null)
			dbManager = new MySQLiteHelper(context, TableDefine.DB_NAME, null, TableDefine.DB_VERSION, TableDefine.getCreateTableSql());
		if(dbInstence == null)
			dbInstence = dbManager.getWritableDatabase();
	}

	/**
	 * 向表插入数据
	 * 
	 * @param tableName
	 *            表名称
	 * @param values
	 *            字段值
	 */
	public void insert(String tableName, ContentValues values) {
		dbInstence.insert(tableName, null, values);
	}

	/**
	 * 更新数据
	 * 
	 * @param tableName
	 *            表名称
	 * @param values
	 *            字段值
	 * @param whereClause
	 * @param whereArgs
	 */
	public void update(String tableName, ContentValues values,
			String whereClause, String[] whereArgs) {
		dbInstence.update(tableName, values, whereClause, whereArgs);
	}

	/**
	 * 删除数据
	 * 
	 * @param tableName
	 *            表名称
	 * @param whereClause 表字段
	 * @param whereArgs 表字段值
	 */
	public void delete(String tableName, String whereClause, String[] whereArgs) {
		dbInstence.delete(tableName, whereClause, whereArgs);
	}

	/**
	 * 查询数据
	 * 
	 * @param sql
	 *            SQL语句,参数用?占位
	 * @param selectionArgs
	 *            参数?的值数组
	 * @return Cursor 游标,注意,和JDBC的ResultSet一样,是在线数据集,所以处理完之前,不能调用close()
	 */
	public Cursor query(String sql, String[] selectionArgs) {
		return dbInstence.rawQuery(sql, selectionArgs);
	}
	
	public ArrayList<User> getUserList(){
		String sql = "select * from " + TableDefine.T_USER_NAME;
		return getUserList(sql ,null);
	}
	/**
	 * query user list 
	 * @param context
	 * @param sql
	 * @param args
	 * @return
	 */
	public ArrayList<User> getUserList(String sql, String[] args) {
		ArrayList<User> userList = new ArrayList<User>();
		Cursor cursor = dbInstence.rawQuery(sql, args);
		while (cursor.moveToNext()) {
			User user = new User();
			user.setUserId(cursor.getInt(0));
			user.setUserName(cursor.getString(1));
			user.setPwd(cursor.getString(2));
			user.setEmail(cursor.getString(3));
			userList.add(user);
		}
		// 注意游标必须要关闭,否则多查询几次就会出现异常
		if (!cursor.isClosed()) {
			cursor.close();
		}
		return userList;
	}
	
	public void close() {
		dbManager.close();
	}
}

有了这个类,我们就完成了数据库的操作了。

来看看一个具体的使用例子:

下图是2个页面,一个是显示页,就是查询数据库里的user,另外的一个添加user的页面:

显示页面的实现:在显示页,我们直接调用数据库,查询出user的list

package com.my;

import java.util.ArrayList;

import com.my.database.DBUtils;
import com.my.database.entity.User;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Ext10databaseActivity extends Activity {
	
	private LinearLayout view;
	
	private Button addBtn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        view = (LinearLayout) findViewById(R.id.view);
        addBtn = (Button) findViewById(R.id.add_btn);
        
        DBUtils db = new DBUtils(getApplicationContext());
        ArrayList<User> list = db.getUserList();
        db.close();
        if(list != null && list.size() > 0) {
        	for(User user : list){
        		TextView text = new TextView(this);
        		text.setText(user.getUserId() + user.getUserName() + user.getPwd() + user.getEmail());
        		view.addView(text);
        	}
        }
        	
        addBtn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(Ext10databaseActivity.this, AddUserActivity.class);
			    startActivity(intent);
			}
		});
    }
}

添加页的实现,在添加页,我们将填入的数据插入数据库(这里没有做数据验证),保存完毕后直接跳会显示页面

package com.my;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.my.database.DBUtils;
import com.my.database.TableDefine;

public class AddUserActivity extends Activity {

	private EditText idText;
	private EditText nameText;
	private EditText pwdText;
	private EditText emailText;
	
	private Button saveBtn;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.add);
		
		idText = (EditText) findViewById(R.id.id_text);
		nameText = (EditText) findViewById(R.id.name_text);
		pwdText = (EditText) findViewById(R.id.pwd_text);
		emailText = (EditText) findViewById(R.id.email_text);
		saveBtn = (Button) findViewById(R.id.save_btn);
		
		saveBtn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				DBUtils db = new DBUtils(getApplicationContext());
			    ContentValues values = new ContentValues();
			    values.put(TableDefine.COLUMN_ID, idText.getText().toString());
			    values.put(TableDefine.COLUMN_Name, nameText.getText().toString());
			    values.put(TableDefine.COLUMN_PWD, pwdText.getText().toString());
			    values.put(TableDefine.COLUMN_EMAIL, emailText.getText().toString());
			    db.insert(TableDefine.T_USER_NAME, values);
			    db.close();
			    Intent intent = new Intent(AddUserActivity.this, Ext10databaseActivity.class);
			    startActivity(intent);
			}
		});
	    
	}
}

注:数据库使用完毕后必须要close.

抱歉!评论已关闭.