Android-Sqlite数据库

Android-Sqlite数据库

本文使用Sqlite数据库,主要使用DatabaseHelper对数据库库表文件进行创建,使用DBManger对数据进行操作。

1.DatabaseHelper初始化

初始化部分放到了Application中实现。创建一个静态变量

/** 数据库Helper对象* */
public static DatabaseHelper databaseHelper = null;

 

在OnCreate()方法中进行实例化。

// 创建数据库
if (databaseHelper == null) {
   databaseHelper = DatabaseHelper.getDBHelper(context);
}

2.DatabaseHelper实现类


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

/**
 * @author M.xang
 * @时间 2018年11月8日
 * @描述 数据库
 */
public class DatabaseHelper extends SQLiteOpenHelper {

	SQLiteDatabase database;
	private static volatile DatabaseHelper instance = null;
	private static String DB_NAME = "name.db";// 数据库名称
	private static int VERSION_NUM = 1;// 数据库版本

	/**
	 * @param context 上下文
	 * @param name    数据库名称
	 * @param factory 为了创建cursor对象, 默认为空
	 * @param version 数据库版本
	 */
	private DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
		super(context, name, factory, version);
		database = this.getWritableDatabase();// 调用此方法时数据库才算真正创建
	}

	/**
	 * 创建实例
	 *
	 * @param context
	 * @return
	 */
	public static DatabaseHelper getDBHelper(Context context) {
		if (instance == null) {
			synchronized (DatabaseHelper.class) {
				if (instance == null) {
					instance = new DatabaseHelper(context,DB_NAME,null,VERSION_NUM);
				}
			}
		}
		return instance;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(DBManager.getInstance().createEXCSQL);
		db.execSQL(DBManager.getInstance().createOrderSQL);
	}

	/**
	 * 数据库升级
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		if (oldVersion < newVersion) {
			Log.e("数据库升级", "oldVersion < newVersion " + oldVersion + "<" + newVersion);
		}
	}

}

3.DBManager公共类实现

package com.wonder.collectionsystem.db;

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

import com.wonder.collectionsystem.MyApplication;
import com.wonder.collectionsystem.bean.ExcDBBean;
import com.wonder.collectionsystem.bean.OrderInfoBean;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;

/**
 * @author M.xang
 * @时间 2018年11月8日
 * @描述 数据库操作类
 */
public class DBManager2 {

	private static DBManager2 dbManager;
	private AtomicInteger mOpenCounter = new AtomicInteger();
	private SQLiteDatabase mDatabase;

	public DBManager2() {
		super();
	}

	/** 获得DBManger实例化 */
	public static final DBManager2 getInstance() {
		if (dbManager == null) {
			synchronized (DBManager2.class) {
				if (dbManager == null) {
					dbManager = new DBManager2();
				}
			}
		}
		return dbManager;
	}

	/**
	 * 保证获得同一个实例,这样如果数据库读写操作放在线程中,不会出现游标关闭的问题
	 * 
	 * @return
	 */
	private synchronized SQLiteDatabase getReadableDatabase() {
		if (mOpenCounter.incrementAndGet() == 1) {
			mDatabase = MyApplication.databaseHelper.getReadableDatabase();
		}
		return mDatabase;
	}

//-----------------------------------------异常库表------------------------------------------------
	/** TODO 工单信息-表名 */
	private String TABLE_EXC = "ExcTable";
	/** 删除导入数据表SQL语句 */
	public final String dropSQL_EXC = "delete from " + TABLE_EXC;
	/** 创建表SQL语句 */
	public final String createEXCSQL = "create table if not exists " + TABLE_EXC + "("
			+ "id integer PRIMARY KEY" + // 主键编号
			",devType varchar" + // 设备类型
			",excType varchar" + // 异常类型
			",excXianXiang     varchar" + // 异常现象
			",excXXID varchar" + // 异常现象ID
			",excReason     varchar" + // 异常原因
			",excReasonID varchar" + // 异常原因ID
			",excReasonTypeID varchar" + // 异常原因分组ID
			")";

	/**
	 ** 插入数据
	 * 
	 * @param saveBean
	 */
	public void insertRecord_EXC(ExcDBBean excDBBean) {
		SQLiteDatabase database = null;
		try {
			database = getReadableDatabase();
			String insertIntoTestDataSQL = "insert into " + TABLE_EXC + "(" + "excType" + // 异常类型
					",excXianXiang" + // 异常现象
					",excXXID" + // 异常现象ID
					",excReason" + // 异常原因
					",excReasonID" + // 异常原因ID
					",devType" + // 设备类型
					",excReasonTypeID" + // 异常原因分组ID
					")" + " values(?,?,?,?,?,?,?)";
			SQLiteStatement statement = database.compileStatement(insertIntoTestDataSQL);
			statement.bindString(1, excDBBean.getExcType());
			statement.bindString(2, excDBBean.getExcXianXiang());
			statement.bindString(3, excDBBean.getExcXXID());
			statement.bindString(4, excDBBean.getExcReason());
			statement.bindString(5, excDBBean.getExcReasonID());
			statement.bindString(6, excDBBean.getDevType());
			statement.bindString(7, excDBBean.getExcReasonTypeID());
			statement.execute();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB(database);
		}
	}

	/**
	 ** 根据设备类型、异常类型、查询采集 异常原因
	 * 
	 * @param devType 设备类型
	 * @param excType 异常类型
	 * @return
	 */
	public ArrayList<ExcDBBean> queryCaiJiByDevAndExcType(String devType, String excType) {
		String sql = "select * from " + TABLE_EXC + " where devType='" + devType + "' and excType='" + excType
				+ "'";
		return query(sql);
	}

	/**
	 ** 根据设备类型、异常类型、异常现象查询异常数据,再根据其中的 异常现象ID 查询所有异常原因
	 * 
	 * @param devType      设备类型
	 * @param excType      异常类型
	 * @param excXianXiang 异常现象
	 * @return
	 */
	public ArrayList<ExcDBBean> queryByDevExcTypeAndExcXX(String devType, String excType,
			String excXianXiang) {
		ArrayList<ExcDBBean> arrayResult = new ArrayList<ExcDBBean>();
		String sql = "select * from " + TABLE_EXC + " where devType='" + devType + "' and excType='" + excType
				+ "' and excXianXiang='" + excXianXiang + "'";
		ArrayList<ExcDBBean> arrayList = query(sql);
		for (int i = 0; i < arrayList.size(); i++) {
			String excXXID = arrayList.get(i).getExcXXID();
			sql = "select * from " + TABLE_EXC + " where excXXID='" + excXXID + "'";
			ArrayList<ExcDBBean> arrayList2 = query(sql);
			for (int j = 0; j < arrayList2.size(); j++) {
				String excReasonTypeID = arrayList2.get(j).getExcReasonTypeID();
				sql = "select * from " + TABLE_EXC + " where excReasonTypeID='" + excReasonTypeID + "'";
				ArrayList<ExcDBBean> arrayList3 = query(sql);
				arrayResult.addAll(arrayList3);
			}
		}
		return arrayResult;
	}

	/**
	 * 查询异常类型所有
	 * 
	 * @param devType
	 * @return
	 */
	public ArrayList<ExcDBBean> queryAllExcType(String excType) {
		String sql = "select * from " + TABLE_EXC + " where excType='" + excType + "'";
		return query(sql);
	}
	// 更新语句
	// String updateSQL = "update " + TABLE_ORDER + " set " + "state='" + state + "'
	// where orderNum='" + orderNum + "'";

	private ArrayList<ExcDBBean> query(String sql) {
		ArrayList<ExcDBBean> list = new ArrayList<ExcDBBean>();
		SQLiteDatabase database = getReadableDatabase();
		Cursor cursor = database.rawQuery(sql, null);
		int count = cursor.getCount();
		try {
			if (count > 0) {// 有记录
				int excTypeIndex = cursor.getColumnIndex("excType");
				int excXianXiangIndex = cursor.getColumnIndex("excXianXiang");
				int excXXIDIndex = cursor.getColumnIndex("excXXID");
				int excReasonIndex = cursor.getColumnIndex("excReason");
				int excReasonIDIndex = cursor.getColumnIndex("excReasonID");
				int devTypeIndex = cursor.getColumnIndex("devType");
				int excReasonTypeIDIndex = cursor.getColumnIndex("excReasonTypeID");

				for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
					String excType = getString(cursor, excTypeIndex);
					String excXianXiang = getString(cursor, excXianXiangIndex);
					String excXXID = getString(cursor, excXXIDIndex);
					String excReason = getString(cursor, excReasonIndex);
					String excReasonID = getString(cursor, excReasonIDIndex);
					String devType = getString(cursor, devTypeIndex);
					String excReasonTypeID = getString(cursor, excReasonTypeIDIndex);

					ExcDBBean excDBBean = new ExcDBBean();
					excDBBean.setExcType(excType);
					excDBBean.setExcXianXiang(excXianXiang);
					excDBBean.setExcXXID(excXXID);
					excDBBean.setExcReason(excReason);
					excDBBean.setExcReasonID(excReasonID);
					excDBBean.setDevType(devType);
					excDBBean.setExcReasonTypeID(excReasonTypeID);
					;
					list.add(excDBBean);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cursor != null) {
				cursor.close();
			}
			closeDB(database);
		}
		return list;
	}

	/**
	 ** 删除所有数据库中的表
	 * 
	 * @return
	 */
	public boolean deleteEXCTable() {
		boolean Ret = false;
		SQLiteDatabase database = null;
		try {
			database = getReadableDatabase();
			database.beginTransaction();// 开始事务
			database.execSQL(dropSQL_EXC);// 删除异常表
			database.setTransactionSuccessful();// 事务完成
			Ret = true;
			database.endTransaction();// 结束事务
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB(database);// 释放数据库资源
		}
		return Ret;
	}

	/**
	 * 关闭数据库释放数据库资源
	 */
	private void closeDB(SQLiteDatabase database) {
		try {
			if (database != null) {
				// 更新器管理的给定对象的字段的当前值为“0”的时候,才正式关闭数据库
				if (mOpenCounter.decrementAndGet() == 0) {
					database.close();// 释放数据库资源
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 删除所有数据库中的表
	 * 
	 * @return
	 */
	public boolean deleteAllDBTable() {
		boolean Ret = false;
		SQLiteDatabase database = null;
		try {
			database = getReadableDatabase();
			database.beginTransaction();// 开始事务
//			database.execSQL(dropSQL_EXC);// 删除异常库
			database.setTransactionSuccessful();// 事务完成
			Ret = true;
			database.endTransaction();// 结束事务
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB(database);// 释放数据库资源
		}
		return Ret;
	}

	private String getString(Cursor cursor, int index) {
		if (cursor != null && index >= 0) {
			return cursor.getString(index);
		}
		return "";
	}

	@SuppressWarnings("unused")
	private int getInt(Cursor cursor, int index) {
		if (cursor != null && index >= 0) {
			return cursor.getInt(index);
		}
		return 0;
	}

	@SuppressWarnings("unused")
	private int getLong(Cursor cursor, int index) {
		if (cursor != null && index >= 0) {
			return (int) cursor.getLong(index);
		}
		return 0;
	}

}

在获取SQLiteDatabase的database对象时,这里采用了getReadableDatabase()方法,这样写法是为了防止当在线程中对数据库进行读写操作时,出现数据流关闭的情况。

private synchronized SQLiteDatabase getReadableDatabase() {
    if (mOpenCounter.incrementAndGet() == 1) {
        mDatabase = MyApplication.databaseHelper.getReadableDatabase();
    }
    return mDatabase;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android中的SQLite数据库是一种轻量级的数据库,它可以在Android应用程序中存储和检索数据。SQLite数据库使用SQL语言来管理数据,可以在Android应用程序中创建、读取、更新和删除数据。使用SQLite数据库可以使应用程序更加高效和可靠,因为它可以在本地存储数据,而不需要访问网络。在Android中使用SQLite数据库需要使用SQLiteOpenHelper类来创建和管理数据库SQLiteOpenHelper类提供了一些方法来创建和升级数据库,以及插入、查询、更新和删除数据。在使用SQLite数据库时,需要注意数据类型、表结构、SQL语句等方面的问题,以确保数据的正确性和完整性。 ### 回答2: Android平台经常使用SQLite数据库来存储和管理本地数据。在本文中,我们将讨论如何在Android中使用SQLite数据库。 首先,在Android中使用SQLite数据库,我们需要创建一个SQLiteOpenHelper类。这个类用于创建和升级数据库。它包含了两个重要的方法:onCreate()和onUpgrade()。onCreate()方法将在首次创建数据库时被调用。onUpgrade()方法将在升级数据库时被调用。我们可以在这个类中定义表名,列名,数据库版本号和其他数据库相关信息。 接下来,在我们使用数据库前,需要实例化一个SQLiteOpenHelper类对象。这个对象用于打开或创建数据库。我们可以使用getReadableDatabase()和getWritableDatabase()方法来获取一个可读/写的数据库对象。 在获取数据库对象后,我们可以执行SQL命令来操作数据库。我们可以使用execSQL()方法来执行SQL命令。我们可以使用insert()、update()和delete()方法来执行增、删、改操作。我们可以使用rawQuery()方法来执行查询操作。 SQLiteOpenHelper类和SQLiteDatabase类并不是线程安全的。因此我们需要确保在使用时进行同步操作。我们可以使用synchronized关键字来达到同步效果。 在Android中,许多第三方的开源框架,如OrmLite、GreenDao和Realm等,提供了ORM(对象关系映射)的功能,使得数据库的操作更加简单和便捷。 总的来说,在Android中使用SQLite数据库可以轻松地存储和管理本地数据。SQLiteOpenHelper和SQLiteDatabase提供了丰富的API来操作数据库。ORM框架为我们提供了更加简便的数据库操作方式。因此,掌握AndroidSQLite数据库的使用非常重要。 ### 回答3: Android SQLite数据库Android开发中最常用的数据库之一,它是一个基于文件的嵌入式关系数据库管理系统。SQLite在设计时考虑到了资源占用和运行效率,所以非常适合在移动设备上使用。下面将详细介绍如何使用Android SQLite数据库。 1. 创建数据库 首先需要创建一个SQLite数据库,通过SQLiteOpenHelper类来创建,传入的参数主要是数据库版本号和数据库名称。在SQLiteOpenHelper的子类中重写onCreate方法来创建表格和一些初始化操作。 2. 执行SQL语句 在SQLiteOpenHelper的子类中重写onUpgrade方法来执行升级操作,可以通过执行ALTER TABLE语句来修改表格结构,并通过DROP TABLE语句删除表格。除此之外,在应用中也可以通过SQLiteDataBase对象的execSQL方法来执行SQL语句,如插入、删除或修改数据等。 3. 增删改查操作 增加(insert):通过SQLiteDataBase对象的insert方法来实现,在方法中传入表名和map对象,map对象中存储数据的键值对。 删除(delete):同样通过SQLiteDataBase对象的delete方法来实现,传入表名和删除条件。 修改(update):也是通过SQLiteDataBase对象的update方法来实现,同时传入修改的数据及条件。 查询(query):同样通过SQLiteDataBase对象的query方法来实现,传入要查询的表名、查询的列、查询条件等参数即可。 4. 事务操作 SQlite数据库支持事务操作,可以在一组操作中,只要有一个操作出现问题,就可以将之前的操作全部回滚,以保证数据的完整性和一致性。 以上就是android-sqlite数据库的使用方法,当然还有很多细节需要注意,例如:表格的设计、SQL语句的优化等。熟练掌握SQLite的使用,可以帮助开发者更好地管理应用数据,提高应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值