`
wiley
  • 浏览: 253734 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android数据库操作(一)

阅读更多

为了以后的项目使用Android数据库更方便,自已写了一个小的应用框架,不知道算不算称得上框架,反正自已用起来觉得还是挺方便的,参考Hibernate了应用思想。

 

业务介绍

1、建一个数据库madfiger.db

2、建一个用户表UserInfo,包含一些用户基本字段

 

好了那么我们现在来实现吧

 

1、新建UserInfo实体类,继承AbstractBaseModel,UserInfo的类名为数据库表名,字段分别为实现了Get与Set方式的实性字段;

 

UserInfo代码如下:

package cn.company.android.project.model;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import cn.madfinger.android.core.AbstractBaseModel;
import cn.madfinger.android.core.util.DateUtils;

public class UserInfo extends AbstractBaseModel{
	private static final long serialVersionUID = -7079062473198239915L;
	private String id;
	private String username;
	private String password;
	private String birthday;
	private int gender;
	private float weight;
	private Date createTime=DateUtils.long2Date(Calendar.getInstance(Locale.CHINESE).getTimeInMillis());
	public UserInfo(){
		super();
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	public float getWeight() {
		return weight;
	}
	public void setWeight(float weight) {
		this.weight = weight;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}

 

 

AbstractBaseModel代码如下:

package cn.madfinger.android.core;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.json.JSONObject;

import android.util.Log;

/**
 * 实体模型基类
 * 
 * @author wiley
 */
public abstract class AbstractBaseModel implements Serializable {

	private static final long serialVersionUID = -4685989463430616599L;
	private static String TAG = AbstractBaseModel.class.getSimpleName();
	private static Map<String, String> TYPES = new HashMap<String, String>();
	
	static {
		TYPES.put("date", "TEXT");
		TYPES.put("string", "TEXT");
		TYPES.put("integer", "INTEGER");
		TYPES.put("int", "INTEGER");
		TYPES.put("short", "INTEGER");
		TYPES.put("long", "INTEGER");
		TYPES.put("float", "REAL");
		TYPES.put("double", "REAL");
	}

	public AbstractBaseModel() {
		TAG = this.getClass().getSimpleName();
	}

	public abstract String getId();
	public abstract void setId(String id);
	
	public Set<String> toFieldSet(){
		return this.toFieldMap().keySet();
	}

	public Map<String, String> toFieldMap() {
		Map<String, String> fieldMap = new HashMap<String, String>();
		Method[] methods = this.getClass().getMethods();
		try {
			String propertyName;
			String typeString;
			for (Method method : methods) {
				String methodName = method.getName();
				if (!methodName.startsWith("get")
						|| methodName.equalsIgnoreCase("getClass")
						|| methodName.equalsIgnoreCase("get"))
					continue;
				typeString = method.getReturnType().getSimpleName();
				propertyName = methodName.substring(3);
				fieldMap.put(propertyName, typeString);
			}
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}
		return fieldMap;
	}

	public String toCreateTableString() {
		StringBuilder sb = new StringBuilder();
		sb.append("CREATE TABLE ");
		sb.append(this.getClass().getSimpleName());
		sb.append(" (");
		int i = 0;
		Map<String, String> fieldMap = toFieldMap();
		Iterator<String> it = fieldMap.keySet().iterator();
		while (it.hasNext()) {
			String field = (String) it.next();
			String type = fieldMap.get(field).toLowerCase();
			if (i++ != 0)
				sb.append(",");
			sb.append(field.toUpperCase());
			sb.append(" " + (TYPES.containsKey(type)?TYPES.get(type):"NONE"));
			if (field.equalsIgnoreCase("id"))
				sb.append(" PRIMARY KEY");
		}
		sb.append(");");
		return sb.toString();
	}

	public String toJSONString() {
		return this.toJSON().toString();
	}

	public JSONObject toJSON() {
		Method[] methods = this.getClass().getMethods();
		JSONObject json = new JSONObject();
		Object propertyValue;
		String propertyName;
		try {
			for (Method method : methods) {
				String methodName = method.getName();
				if (!methodName.startsWith("get")
						|| methodName.equalsIgnoreCase("getClass")
						|| methodName.equalsIgnoreCase("get"))
					continue;
				propertyValue = method.invoke(this, new Object[] {});
				propertyName = methodName.substring(3);
				propertyName = Character.toLowerCase(propertyName.charAt(0))
						+ propertyName.substring(1);
				json.put(propertyName, propertyValue);
			}
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}
		return json;
	}
}

 

 

实体类新建后配置Sqlite.xml,此文件位与res/string下

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<!-- 数据库版本 -->
	<string name="database_version">1</string>
	<!-- 数据库名称 -->
    <string name="database_name">madfinger.db</string>
    <!-- 数据表对应实列 -->
    <string-array name="model_beans">
    	<item>cn.company.android.project.model.UserInfo</item>
    </string-array>
</resources>

 

 在软件启动时new SqlitHelper,那么在数据库与表将被自动新建,若需要新建多张表的话只需要新建多个继承AbstractBaseModel类的实体类,并添加至sqlite.xml中即可

 

下面我再将sqlitHelper贴出来

 

package cn.madfinger.android.core;

import java.util.LinkedList;
import java.util.List;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import cn.company.android.project.R;
import cn.madfinger.android.core.util.StrUtils;

/**
 * 数据库初始化
 * @author wiley
 *
 */
public class SqliteHelper {
	private static final String TAG = SqliteHelper.class.getSimpleName();

	private static SQLiteDatabase mWriterHandler;
	private static SQLiteDatabase mReaderHandler;
	private static int mVersion;
	private static String mDatabase;
	public static List<Class<? extends AbstractBaseModel>> mBeanList = new LinkedList<Class<? extends AbstractBaseModel>>();
	private DatabaseHelper mDBHelper;
	
	@SuppressWarnings("unchecked")
	public SqliteHelper(Context context) {
		Log.i(TAG, "new SqliteHelper");
		mVersion=StrUtils.str2int(context.getResources().getString(R.string.database_version), 1);
		mDatabase=StrUtils.null2string(context.getResources().getString(R.string.database_name), "madfinger.db");
		String[] modelBeans=context.getResources().getStringArray(R.array.model_beans);
		if(null!=modelBeans){
			for(String modelBean:modelBeans){
				try {
					mBeanList.add((Class<? extends AbstractBaseModel>)Class.forName(modelBean));
				} catch (ClassNotFoundException e) {
					Log.d(TAG, "",e);
				}
			}
		}
		//初始化数据库
		if(null!=mBeanList&&mBeanList.size()>0){
			mDBHelper = new DatabaseHelper(context);
			mWriterHandler=mDBHelper.getWritableDatabase();
		}
	}
	
	

	public SQLiteDatabase getWriterHandler() {
		if(null==mWriterHandler)
			mWriterHandler=mDBHelper.getWritableDatabase();
		return mWriterHandler;
	}
	
	public SQLiteDatabase getReaderHandler() {
		if(null==mReaderHandler)
			mReaderHandler=mDBHelper.getWritableDatabase();
		return mReaderHandler;
	}

	public void release() {
		if (null != mWriterHandler) {
			mWriterHandler.close();
			mWriterHandler = null;
		}
		if(null!=mReaderHandler){
			mReaderHandler.close();
			mReaderHandler=null;
		}
	}

	private static class DatabaseHelper extends SQLiteOpenHelper {

		DatabaseHelper(Context context) {
			super(context,mDatabase , null, mVersion);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			Log.i(TAG, "onCreate ");
			createTable(db);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.i(TAG, "Upgrading database from version " + oldVersion + " to "
					+ newVersion + ", which will destroy all old data");

			// 删除旧表格
			deleteTable(db);
			// 创建新表
			createTable(db);
		}

		@Override
		public void onOpen(SQLiteDatabase db) {
			super.onOpen(db);
			Log.i(TAG, "onOpen ");
		}

		/*
		 * 创建所有表
		 */
		private void createTable(SQLiteDatabase db) {
			Log.i(TAG, "createTable begin");
			for(Class<? extends AbstractBaseModel> clazz:mBeanList){
				try {
					String sqlString = clazz.newInstance().toCreateTableString();
					Log.i(TAG, sqlString);
					db.execSQL(sqlString);
				} catch (IllegalAccessException e) {
					Log.e(TAG, "",e);
				} catch (InstantiationException e) {
					Log.e(TAG, "",e);
				}
			}
			Log.i(TAG, "createTable end");
		}

		/*
		 * 删除所有表
		 */
		private void deleteTable(SQLiteDatabase db) {
			Log.i(TAG, "deleteTable begin");
			String sql = "DROP TABLE IF EXISTS ";
			for(Class<? extends AbstractBaseModel> clazz:mBeanList){
				Log.i(TAG, sql + clazz.getSimpleName());
				db.execSQL(sql + clazz.getSimpleName());
			}
			Log.i(TAG, "deleteTable end");
		}
	}
}

 

 数据库操作将在后一章节中分享给大家

分享到:
评论

相关推荐

    android数据库操作封装

    "android数据库操作封装"主要是为了提高代码的可读性、可维护性和复用性,通过创建自定义的数据访问对象(DAO)层和数据库帮助类来实现。 1. 数据库Helper类: 在Android中,我们通常会创建一个继承自`...

    android数据库操作实例

    总结来说,这个"android数据库操作实例"涵盖了Android应用中使用SQLite数据库的基础知识,包括创建数据库、定义表结构、插入、查询、更新和删除数据等操作。通过学习这个实例,开发者可以更好地理解如何在Android...

    Android 数据库操作 以及命令行上操作sqlite

    本文将深入探讨Android中的SQLite数据库操作以及如何在命令行上操作SQLite。 首先,让我们了解Android如何与SQLite交互。在Android中,我们通常通过SQLiteOpenHelper类来创建、升级和访问数据库。这个类提供了方法...

    android数据库操作demo

    总结起来,"android数据库操作demo"提供了一个基础的Android应用示例,用于展示SQLite数据库的使用。通过`SQLiteOpenHelper`和自定义的`DatabaseAdapter`类,我们可以方便地进行数据库的创建、升级、数据的插入、...

    你想要Android数据库操作精华(安全、并发、单例等)

    在Android应用开发中,数据库是存储和...对于想要深入学习Android数据库操作的开发者来说,这是一个非常有价值的实践案例。通过研究这个Demo,你可以了解到如何在实际项目中实现这些功能,提升你的Android开发技能。

    android数据库操作Demo

    本示例"android数据库操作Demo"提供了一个基础的教程,涵盖了数据库的基本操作,包括添加数据(增)、删除数据(删)、查询数据(查)和更新数据(改)。我们将深入探讨这些核心概念。 首先,Android使用SQLite作为...

    Android 数据库操作

    在这个"Android 数据库操作"主题中,我们将深入探讨如何在Android应用中使用SQLite3进行数据库的创建、查询、插入、更新和删除等操作。 首先,让我们了解Android中的SQLite数据库的基本概念。每个Android应用都有一...

    android 数据库操作封装类 继承可用

    在Android开发中,数据库操作是常见的任务之一,用于存储和检索应用程序的数据。为了简化这一过程,开发者通常会创建一个数据库帮助类(DataBaseHelper)来封装SQLite数据库的操作。在这个场景下,我们有一个名为`...

    Android数据库ORM封装

    总结来说,Android数据库ORM封装使得数据库操作更加简便,通过Room框架,我们可以以声明式的方式定义数据库操作,同时保持代码的清晰和可维护性。`DataBaseDemo`项目则提供了具体的实现示例,有助于你在实际项目中...

    Android数据库操作命令

    Android数据库sqlite操作命令指导,同时可以快速调试定位问题点,并获取有用信息。

    Android数据库SQLite详解

    本文将深入探讨SQLite在Android中的使用,包括基本概念、数据库操作以及实际应用示例。 ### 1. SQLite基本概念 - **数据库**: 数据库是存储和组织数据的结构化系统,SQLite在Android中表现为一个数据库文件,扩展...

    android数据库应用实例

    为了提高数据库性能,可以考虑使用索引、避免在循环中执行数据库操作、批量插入数据等策略。同时,合理设计表结构,减少冗余数据,也是优化的关键。 11. 数据库安全与备份 考虑到数据安全,开发者需要对敏感信息...

    Android数据库完美框架和示例

    在Android开发中,数据库是应用数据持久化的重要方式。Android提供了SQLite数据库系统...在`DemoDateBase`压缩包中,应该包含了这个框架的实现代码,你可以下载并参考其中的细节,进一步学习和实践Android数据库操作。

    Android实验报告Sqlite数据库操作.pdf

    Android SQLite 数据库操作报告 一、实验目的 Android 实验报告的主要目的是熟悉 Android 平台的文件操作、掌握 Android SQLite 数据库的设计和应用、熟悉 XML 和 JSON 文件的读取。通过本实验,用户可以掌握 ...

    android 数据库操作小插件

    android sqlite 操作工具包

    Android异步操作数据库

    你可以创建一个`AsyncTask`子类,将数据库操作放入`doInBackground()`方法中,然后在`onPostExecute()`方法中更新UI。这样,数据库操作不会影响主线程,提升应用响应速度。 2. **Handler-Looper-Message机制** 另...

    Android数据库框架GreenDAO的基本操作

    创建一个继承自DaoSession的类,这个类将包含所有数据库操作的方法。 4. 初始化GreenDAO。在应用启动时,使用DaoMaster.DevOpenHelper创建并升级数据库,然后通过DaoSession管理数据库操作。 基本操作包括: 1. ...

    android 项目数据库操作

    在Android开发中,数据库操作是不可或缺的一部分,尤其是在构建复杂应用程序时。Android系统支持SQLite数据库,一个轻量级的关系型数据库,适用于移动设备。本项目"android 项目数据库操作"主要探讨了如何在Android...

    android数据库实例.pdf

    Android数据库实例 Android数据库实例是指在Android应用程序中使用的数据库系统,用于存储和管理应用程序的数据。在Android系统中, SQLite数据库是最常用的数据库管理系统,它提供了一个轻量级的关系数据库管理...

    Android数据库操作实例代码

    本实例代码主要关注如何在Android中进行数据库操作,这涉及到SQLite数据库,它是Android系统内置的关系型数据库管理系统。SQLite轻量级、易于使用且功能强大,非常适合移动设备。 首先,我们需要创建一个SQLite...

Global site tag (gtag.js) - Google Analytics