`
zhangfan822
  • 浏览: 255671 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Android中用文件初始化sqlite 数据库的文(二)

阅读更多

方法1已经讲述了一种初始化数据库的方法

它的数据库初始化不是用sql语句,而是用一个现成的sqlite的二进制文件进行直接copy到Android系统的数据库路径中。我一方面不太放心这种二进制文件的直接copy,另一方面,如果sqlite数据库的二进制结构有所升级或变动,我的程序就无法对所有sqlite版本兼容了。

 

方法2:在启动时,执行sql文件进行数据库初始化.

SQLiteOpenHelper的onCreate仅在程序第一次使用数据库时执行,然后执行onCreate;此后的执行就会跳过onCreate,直接执行onOpen。因此完全无需自己去检测数据库是否最在.

以下按照SQLiteOpenHelper的”正确“使用方法,本人写的SQLiteOpenHelper的子类,你可以用它初始你的Android数据库。数据库用sql语句形式,放在项目的res / raw目录底下,记住每行一条语句(因为我用readline()来读源文件),不能换行!你可以用本地数据库导出工具,此处省略数据导出。

代码如下:

/**
 *
 */
package com.yourpackage;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * @author fan.zhang
 *
 */
public class DataBaseHelper extends SQLiteOpenHelper {
	private static String DB_PATH = "/data/data/your_package_name/databases/";
	private static final String DB_NAME = "your_db_name.db";

	private SQLiteDatabase myDataBase;

	private final Context myContext;

	public FileSQLiteHelp(Context context) {
		super(context, DB_NAME, null, 1);
		this.myContext = context;
	}

	/**
	 * inital your database from your local res-raw-folder to the just created
	 * empty database in the system folder, from where it can be accessed and
	 * handled.
	 * */
	private void initDataBase()throws IOException {

		// Open your local db as the input stream
		// InputStream myInput = myContext.getAssets().open(DB_NAME);
		InputStream myInput = myContext.getResources().openRawResource(
				R.raw.your_db_file_name);
		InputStreamReader reader = new InputStreamReader(myInput);
		BufferedReader breader = new BufferedReader(reader);

		// Path to the just created empty db
		String outFileName = DB_PATH + DB_NAME,
		str;

		// Open the empty db as the output stream
		FileWriter myOutput = new FileWriter(outFileName, true);
		while ((str = breader.readLine()) != null) {
			myDataBase.execSQL(str); //exec your SQL line by line.
		}

		// Close the streams
		myOutput.flush();
		myOutput.close();
		myInput.close();

	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite
	 * .SQLiteDatabase)
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		myDataBase = db;

		try {
			this.initDataBase();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public void onOpen(SQLiteDatabase db) {
		boolean readOnly = db.isReadOnly();
	}
	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite
	 * .SQLiteDatabase, int, int)
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}
}

可以按正常逻辑用DataBaseHelper.getReadableDatabase()来使用你的数据库了。

分享到:
评论
1 楼 beming 2013-12-31  
两个情况:
1,代码只能在android2.2以上版本才能使用,如果要在2.1下,参考
http://stackoverflow.com/questions/5332328/sqliteopenhelper-problem-with-fully-qualified-db-path-name

2,如果sql语句较多,这个执行会非常慢,解决方案:增加事务,效率提高好多好多。

相关推荐

    android中用SQLite对学生表进行增删改查

    通过这个"android中用SQLite对学生表进行增删改查"的项目,你可以学习到如何在Android环境中有效地管理SQLite数据库,从而实现数据的持久化存储。对于初学者来说,这是一个非常实用且基础的学习材料,有助于理解和...

    andorid SQLite操作

    在这个SQLiteDemo中,我们将深入探讨如何在Android应用中进行SQLite数据库的操作,包括增、删、改、查(CRUD)的基本步骤。 首先,我们需要在Android项目中引入SQLite的支持。在`build.gradle`文件中添加以下依赖:...

    Android Studio中用GreenDAO

    GreenDAO是一个专门为Android平台设计的高效ORM(对象关系映射)框架,它使得在Android应用中操作SQLite数据库变得更加便捷。在Android Studio中使用GreenDAO,可以极大提高开发效率,减少与数据库交互时的复杂性。 ...

    待办事项APP 记事本 登录 注册 增删改查 连接数据库 listview适配器 显示重要程度 显示已完成、未完成事项

    ListView是Android中用来展示列表数据的视图组件,常用于显示大量数据。在待办事项APP中,ListView用于展示待办事项列表。Adapter是连接数据源和ListView的桥梁,它将数据转化为ListView可显示的视图。开发者需要...

    android 简易播放器

    8. **SQLite数据库**:虽然这里未明确提及,但为了缓存音乐信息或保存用户偏好,可能需要使用SQLite数据库来存储数据。 9. **ListView/RecyclerView**:展示音乐列表通常会用到ListView或RecyclerView,它们是...

    Android应用源码维语词典项目

    Android提供了SQLite数据库作为本地数据存储的解决方案,`DictionaryProvider`可能是实现了ContentProvider接口的类,用于在应用间共享数据。开发者可以在这里学习如何创建数据库表,插入、查询和更新词汇数据。 ...

    Android 微信语音

    Android内置SQLite数据库,提供了一个简单易用的API来操作数据库。我们可以在应用启动时初始化数据库和表结构,然后在需要时插入、查询、更新或删除语音消息记录。 当用户发送语音时,先将录制的语音文件保存到本地...

    几个关于Android的程序

    3. **SQLite数据库**: Android系统内置了SQLite数据库,用于存储应用数据。在名片夹应用中,可能会使用SQLite来存储联系人的详细信息。开发者需要创建数据库表结构,定义字段,然后通过`SQLiteOpenHelper`类来管理...

    Android-高仿QQ看房app

    - `MainActivity`:主入口点,负责初始化应用并处理用户交互。 - `Fragment`:用于展示不同的视图或功能区域,可以在不重新创建Activity的情况下切换屏幕内容。 - `Adapter`:与RecyclerView或ListView等视图组件...

    Google Android SDK开发范例大全 源码

    5. **数据存储**:Android提供了多种数据存储方式,如SharedPreferences、SQLite数据库、文件系统等。源码会展示如何使用这些方式读写数据。 6. **Content Provider**:对于跨应用数据共享,源码会介绍如何实现和...

    AndroidProvider Demo

    `ContentProvider` 是Android中用于存储和检索数据的标准接口,它可以访问SQLite数据库、文件系统或其他数据源。在`ContentProviderServer`中,你需要定义一个继承自`android.content.ContentProvider`的类,重写...

    通讯录demo

    1. **ListView**: `listviewitem`标签表明了此项目使用了ListView组件,这是Android中用来展示可滚动列表的标准视图。ListView可以动态加载大量数据,并且支持自定义列表项布局,使其成为展示联系人列表的理想选择。...

    XUtils使用方法

    DBUtils是XUtils中用于数据库操作的工具类,它简化了对SQLite数据库的操作。例如,创建表、插入数据、查询数据等。首先,需要定义一个实体类,与数据库表对应: ```java public class User { @TableField(column =...

    AndroidBasics:Android基础代码仓库

    5. **数据存储**:Android提供多种数据存储方式,包括 SharedPreferences、SQLite 数据库和文件系统。在AndroidBasics项目中,你可能遇到如何使用这些机制来持久化数据的例子。 【Android开发环境和工具】 为了...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    main_building_blocks_android

    例如,`onCreate()`方法用于初始化界面,`onStart()`和`onResume()`则分别表示活动变得可见和可交互。 2. **Intent**:Intent是Android中的一个关键概念,它用于启动Activity或Service,或者在它们之间传递数据。...

    PokeApp

    在这里,我们可能会看到如何使用`public static void main(String[] args)`方法来初始化应用程序,并调用其他功能模块。此外,Java的异常处理机制,如try-catch-finally语句块,用于处理可能出现的错误和异常,保证...

Global site tag (gtag.js) - Google Analytics