`
04023129
  • 浏览: 161561 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

如何在android中使用你自己的数据文件

阅读更多

Most all of the Android examples and tutorials out there assume you want to create and populate your database at runtime and not to use and access an independent, preloaded database with your Android application.

The method I'm going to show you takes your own SQLite database file from the "assets" folder and copies into the system database path of your application so the SQLiteDatabase API can open and access it normally.

 

1. Preparing the SQLite database file.

Assuming you already have your sqlite database created, we need to do some modifications to it.
If you don't have a sqlite manager I recommend you to download the opensource SQLite Database Browser available for Win/Linux/Mac.

Open your database and add a new table called "android_metadata", you can execute the following SQL statement to do it:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')

Now insert a single row with the text 'en_US' in the "android_metadata" table:

INSERT INTO "android_metadata" VALUES ('en_US')

Then, it is necessary to rename the primary id field of your tables to "_id" so Android will know where to bind the id field of your tables.
You can easily do this with SQLite Database Browser by pressing the edit table button Edit Table, then selecting the table you want to edit and finally selecting the field you want to rename.

After renaming the id field of all your data tables to "_id" and adding the "android_metadata" table, your database it's ready to be used in your Android application.

Modified database

Modified database

Note: in this image we see the tables "Categories" and "Content" with the id field renamed to "_id" and the just added table "android_metadata".

2. Copying, opening and accessing your database in your Android application.

Now just put your database file in the "assets" folder of your project and create a Database Helper class by extending the SQLiteOpenHelper class from the "android.database.sqlite" package.

Make your DataBaseHelper class look like this:

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.
 
}

That's it.
Now you can create a new instance of this DataBaseHelper class and call the createDataBase() and openDataBase() methods. Remember to change the "YOUR_PACKAGE" to your application package namespace (i.e: com.examplename.myapp) in the DB_PATH string.

       ...
 
        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;
 
 	}
 
        ...

 


Enjoyed this post? ReignDesign is a great team of tech-savvy developers providing RIA and mobile services. For more articles like this, subscribe to our blog feed.

Tags: Android, Databases, howto, Java, SQLite

分享到:
评论
1 楼 chengxinwo 2011-09-24  
good!

相关推荐

    将Excel数据导入android数据库DB文件

    本教程将指导你如何将Excel数据导入到Android应用的SQLite数据库.db文件中,以便在应用运行时能够访问和操作这些数据。我们将使用SQLite Expert Professional这款强大的SQLite数据库管理工具,该工具在提供的压缩包...

    Android将数据导出为excel文件的方法

    在build.gradle文件中添加依赖: ```groovy dependencies { implementation 'com.github.nkzawa:android-excel:0.1.3' // 或其他版本 } ``` 2. **创建Excel文件**:在Android中,我们通常会在外部存储(SD卡)上...

    Android存储字符串数据到txt文件

    "Android存储字符串数据到...使用FileUtils工具类可以非常方便地将字符串数据存储到txt文件中,从而满足我们的需求。但是,需要注意的是,在使用FileUtils工具类时,需要确保文件路径和文件名的正确性,以免出现错误。

    android中基于socket方式的文件上传

    3. **文件读取与分块**:在Android客户端,你需要打开待上传的文件,将其内容读取到内存中。考虑到文件大小可能较大,通常采用流式读取,并将文件分块,每一块作为一个数据包发送。 4. **错误处理**:在实际操作中...

    android项目中读取ini配置文件

    在Android应用开发中,有时我们需要将一些系统配置信息存储在外部文件中,以方便管理和更新。在这种情况下,`ini`文件格式是一个常见的选择,因为它的结构简单,易于读写。本文将详细介绍如何在Android项目中读取...

    Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。

    Android 使用 AudioRecord 和 AudioTrack 完成音频PCM数据的采集和播放,并读写音频wav文件。 封装好的Java代码,可同时录制...PCM是原始音频数据,WAV是windows中常见的音频格式,只是在pcm数据中添加了一个文件头。

    android jni使用libzip读取压缩文件

    在Android环境中,通过JNI调用libzip库可以实现原生层对ZIP文件的操作,这在处理大量数据或者需要高效读取压缩文件的场景下非常有用。 首先,你需要在Android项目的jniLibs目录下添加libzip库的.so文件,确保它们...

    Android手机间使用socket进行文件互传

    在提供的"FilePass"压缩包文件中,可能包含了实现上述功能的示例代码或工具类。解压并研究这些文件可以帮助你更好地理解和实践Android设备间的Socket文件互传。不过,要注意的是,实际应用中还应考虑错误处理、网络...

    老罗android视频开发源码和ppt--android存储数据和文件.rar

    数据以XML格式存储在文件中,易于读写。 2. **内部存储**:应用私有的存储空间,只有应用本身可以访问。用于存储敏感数据或者需要在应用生命周期内持久化的数据。 3. **外部存储**:对于大文件,如图片、音频和...

    android 导出数据到excel表格文件 .zip

    一旦数据存储在SQLite数据库中,我们可以使用Apache POI库来生成Excel文件。Apache POI是一个用于处理Microsoft Office格式文件的开源Java库,支持HSSF(处理.xls文件)和XSSF(处理.xlsx文件)。在Android项目中,...

    (原创)android使用AES加密和解密文件

    本篇文章将探讨如何在Android应用中实现AES加密和解密文件,以确保数据的安全性。 首先,我们需要了解AES的工作原理。AES是一种分组密码,它使用相同的密钥进行加密和解密,具有128位的块大小,并支持128、192和256...

    Android读写配置文件

    它将数据保存在XML文件中,通常位于应用的私有目录下。下面是如何使用SharedPreferences进行读写操作: 1. **写入配置文件**: - 获取SharedPreferences实例:通常在Activity或Fragment中,通过`...

    Android创建文件并读写数据

    在Android系统中,创建文件并进行读写操作是应用程序中常见的功能,比如保存用户设置、存储游戏进度或者缓存网络数据。以下将详细介绍如何在Android环境中实现这些操作。 首先,要创建一个文件,你需要获得一个File...

    android使用socket上传、下载文件

    本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议之间的接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在Android中,我们...

    Android文件上传,文件选择器,多选

    在Android应用开发中,文件上传和文件选择器是常见的功能需求。用户可能需要从设备存储中选择一个或多个文件,例如图片、文档或音频文件,然后上传到服务器或进行其他操作。本文将深入探讨如何在Android平台上实现...

    Android本地数据存储之文件存储读写

    在Android应用开发中,本地数据存储是至关重要的一个环节,特别是在处理用户数据或者应用程序需要持久化数据时。本文将深入探讨Android系统中的文件存储机制,包括如何读取、写入、重写和删除.txt格式的文件。理解...

    Android读取本地json文件的方法(解决显示乱码问题)

    在Android应用开发中,有时我们需要从本地存储的JSON文件中读取数据,这通常涉及到文件I/O操作和字符编码处理。以下将详细讲解如何在Android中读取本地JSON文件,并解决可能出现的显示乱码问题。 1. **读取本地JSON...

    Android Excel文件写入和读取

    在Android应用开发中,有时需要处理大量的结构化数据,这时Excel文件就成为一个理想的存储选择,因为它们便于人类阅读,同时也方便程序进行数据处理。本文将详细介绍如何在Android中实现Excel文件的读取与写入。 ...

    文件复制及进度条 android 文件复制 进度条 progressdialog

    在Android开发中,文件复制和进度条的显示是常见的需求,尤其在移动应用中,用户可能需要将数据从一个位置移动到另一个位置,或者在后台下载文件时展示进度。`ProgressDialog`是Android SDK提供的一种对话框组件,...

    java android 读取dat文件

    在Java和Android开发中,有时会遇到需要处理各种类型的文件,包括`.dat`文件。`.dat`文件本身没有特定的格式,它通常被用来存储任意数据,由创建它的应用程序定义结构。本篇将深入探讨如何在Java和Android环境中读取...

Global site tag (gtag.js) - Google Analytics