日期:2014-05-16  浏览次数:20878 次

有关SQLite数据库的一些操作

1.在程序中如何使用自定义的数据库

?

在程序外部获取到数据库以后,将这个数据库放到res/raw目录下。如果数据库过大,可以考虑将数据库的后缀名改为.jpg这样做的目的是系统会帮你压缩这个数据库。

当第一次打开应用程序的时候,数据库会被加载到data/data目录下。这个需要在模拟器环境下才可以看到。在测试的时候,可以检查该目录下是否成功生成数据库。也可以在DDMS里面把数据库取出来,使用SqliteDev来查看表结构等等。

需要在程序中执行一些数据库操作的时候,可以先在SqliteDev里面用sql语句进行测试。如果成功执行了,再写到代码里面。这样效率会比较高。

?

public class DataBaseHelper extends SQLiteOpenHelper
{

	public final static String DB_NAME = "telloc.db";
	
	public DataBaseHelper(Context context, String dbName)//使用自定义的构造器
	{
		super(context, dbName, null, 3);
		// 先执行 判断 数据库文件是否存在, 不存在则从本地文件拷贝至数据库位置
		CopyDB(context, false);
	}
	
	/**
	 * 第一次执行程序的时候,判断是否存在数据库,不存在就加入
	 * 
	 * */
	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		
	}

	/**
	 * 数据库版本号发生变化的时候被调用,更新数据库和数据库版本号
	 * 
	 * */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
	{
		
	}

	/**
	 * 复制数据库, 不存在或者强制要求覆盖时覆盖
	 * 
	 * @param isCover
	 */
	public static void CopyDB(Context context, boolean willCover) {
		System.out.println("CopyDB" + context);
		File path = context.getDatabasePath(DB_NAME);
		if (!path.exists()) {
			// 首先要创建这个文件夹, 如果不存在的话。。。 否则FileOutputStream(path) 报错
			new File(path.toString().substring(0, path.toString().lastIndexOf("/"))).mkdirs();
		} else if (!willCover) {
			return;
		}

		InputStream is = context.getResources().openRawResource(R.raw.telloc);
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(path);

			byte[] buffer = new byte[1024];

			int count = 0;

			while ((count = is.read(buffer)) > 0) {
				fos.write(buffer, 0, count);
			}
			fos.close();
			is.close();
//			Log.e(TAG, "create new database");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
}
?

使用

helper = new DataBaseHelper(myContext, DataBaseHelper.DB_NAME);

?

		String areaCity = "";
		
		Cursor	cursor = helper.getReadableDatabase().query(
				"area_code", 	//表名
				new String[]{"area_code", "city"}, //字段名
				"area_code = ? or area_code = ?",  //查询前面3位或者4位
				new String[]{myNumber.substring(0, 3), myNumber.substring(0, 4)}, 
				null, null, null);
		
		if(cursor.getCount() == 0)
		{
			areaCity = "";
		}
		else//有查询出记录,取第一条
		{
			if(cursor.moveToFirst())
			{
				areaCity = cursor.getString(cursor.getColumnIndex("city"));
				 
			}
		}
		
		cursor.close();//使用后记得关闭
		
		return areaCity;

?

?

3.创建自己的数据库

?

String sqlForCreateTable = "CREATE TABLE [my_calls]("+" [_id]INTEGER, "+" [number]INTEGER, "+" [date]INTEGER, "+" [duration]INTEGER, "+" [type]INTEGER, "+" [name]VARCHAR(50), "+" [tel_location]VARCHAR(100))";
		Log.e("sqlForCreateTable", sqlForCreateTable);
		db.execSQL(sqlForCreateTable);

?

?

4.查找系统数据库中的字段,添加到自己的数据库

?

Cursor cursor  = myContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.DATE, CallLog.Calls.DURATION, CallLog.Calls.TYPE, CallLog.Calls.CACHED_NAME}, null, null, null);
		
		if(cursor != null)//获取查询出来的记录,添加到自己的表中
		{
			
			Log.e("cursorCount", "cursor:"+cursor.getCount());
			while(cursor.moveToNext())
			{
				ContentValues cv = new ContentValues();//类似于键值对的方式保存数据
				cv.put("_id", cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID)));
				String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
				cv.put("number", number);
				cv.put("date", cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE)));
				cv.put("duration", cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION)));
				cv.put("type", cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE)));
				cv.put("name", cursor.getString(