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

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

阅读更多

很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据。

这里有2个思路

1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时,用现成的sqlite的二进制文件进行直接copy到Android系统的数据库路径

2.可以考虑在第一次启动时,执行数据库初始化的sql文件.

 

方法1:

1.在本地准备android能使用的sqlite数据库文件

使用sqlite数据库管理工具,看个人爱好(SQLite Database Browser ,Navicat Premium,)

打开数据库,创建"android_metadata"数据表

CREATE TABLE "android_metadata" ("_id"  INTEGER PRIMARY KEY AUTOINCREMENT,"locale" TEXT DEFAULT 'en_US');//创建表
INSERT INTO "android_metadata" VALUES (1,'en_US');//插入值

 创建其他应用需要的表..此处省略.

 

2.复制文件到应用中.

把第一步创建的数据库文件复制到应用中的assets文件夹,然后创建DateBaseHelper extends SQLiteOpenHelper的类文件.

代码如下:

public class DataBaseHelper extends SQLiteOpenHelper {
	//The Android's default system path of your application database.
	private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
	private static String DB_NAME = "myDBName";
	private SQLiteDatabase myDataBase;
	private final Context myContext;
	/**
	 * Constructor
	 * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
	 * @param context
	 */
	public DataBaseHelper(Context context) {
		super(context, DB_NAME, null, 1);
		this.myContext = context;
	}

	/**
	 * Creates a empty database on the system and rewrites it with your own database.
	 * */
	public void createDataBase()throws IOException {
		boolean dbExist = checkDataBase();
		if (dbExist) {
			//do nothing - database already exist
		} else {
			//By calling this method and empty database will be created into the default system path
			//of your application so we are gonna be able to overwrite that database with our database.
			this.getReadableDatabase();
			try {
				copyDataBase();
			} catch (IOException e) {
				throw new Error("Error copying database");
			}
		}
	}

	/**
	 * Check if the database already exist to avoid re-copying the file each time you open the application.
	 * @return true if it exists, false if it doesn't
	 */
	private boolean checkDataBase() {
		SQLiteDatabase checkDB = null;
		try {
			String myPath = DB_PATH + DB_NAME;
			checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
		} catch (SQLiteException e) {
			//database does't exist yet.
		}

		if (checkDB != null) {
			checkDB.close();
		}
		return checkDB != null ? true : false;
	}

	/**
	 * Copies your database from your local assets-folder to the just created empty database in the
	 * system folder, from where it can be accessed and handled.
	 * This is done by transfering bytestream.
	 * */
	private void copyDataBase()throws IOException {
		//Open your local db as the input stream
		InputStream myInput = myContext.getAssets().open(DB_NAME);
		// Path to the just created empty db
		String outFileName = DB_PATH + DB_NAME;
		//Open the empty db as the output stream
		OutputStream myOutput = new FileOutputStream(outFileName);
		//transfer bytes from the inputfile to the outputfile
		byte[]buffer = new byte[1024];
		int length;
		while ((length = myInput.read(buffer)) > 0) {
			myOutput.write(buffer, 0, length);
		}

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

	public void openDataBase()throws SQLException {
		//Open the database
		String myPath = DB_PATH + DB_NAME;
		myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
	}

	@Override
	public synchronized void close() {
		if (myDataBase != null)
			myDataBase.close();
		super.close();
	}

	@Override
	public void onCreate(SQLiteDatabase db) {}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
	// Add your public helper methods to access and get content from the database.
	// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
	// to you to create adapters for your views.
}

 

3.现在我们可以创建DateBaseHelper的实现操作了.

createDataBase() //创建

openDataBase()//打开只读数据库

记得要更改"YOUR_PACKAGE"为你的应用的包名

如:com.examplename.myapp

大概代码如下:

...
DataBaseHelper myDbHelper = new DataBaseHelper();
myDbHelper = new DataBaseHelper(this);
try {
	myDbHelper.createDataBase();
} catch (IOException ioe) {
	throw new Error("Unable to create database");
}
try {
	myDbHelper.openDataBase();
} catch (SQLException sqle) {
	throw sqle;
}
...

 

分享到:
评论

相关推荐

    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可以动态加载大量数据,并且支持自定义列表项布局,使其成为展示联系人列表的理想选择。...

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

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

    XUtils使用方法

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

    AndroidBasics:Android基础代码仓库

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

    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