android系统在线打开sqlite数据库库文件怎么打开

所有回答(1)
代码不全哦,空指针的话,你着重检查对象是否有效。
园豆:32074
园豆:32074
园豆:32074
&&&您需要以后才能回答,未注册用户请先。博客访问: 356056
博文数量: 193
博客积分: 3845
博客等级: 中校
技术积分: 2003
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
&上一篇跟各位童鞋介绍了SharedPreference 和 File流如何存储数据,并且推荐使用FileOutputStream/FileInputStream来存储咱们游戏数据,那么这一篇则是像大家介绍另外一种适合游戏数据存储的方式:SQLite 轻量级数据库!
先介绍几个基本概念知识:
&什么是SQLite:
&& & & SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!!
SQLite的特性:
轻量级使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。
独立性SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
隔离性SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
跨平台SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。
多语言接口SQLite 数据库支持多语言编程接口。
安全性SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据.
&& & &优点:1.能存储较多的数据。
&& & & & & & & &2.能将数据库文件存放到SD卡中!
什么是 SQLiteDatabase?&
&& & 一个 SQLiteDatabase 的实例代表了一个SQLite 的数据库,通过SQLiteDatabase 实例的一些方法,我们可以执行SQL 语句,对数 & & & &据库进行增、删、查、改的操作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。
什么是 SQLiteOpenHelper ?
&& & 根据这名字,我们可以看出这个类是一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的 & & & &方法getWritableDatabase(),或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android 系统就会自动生成一 & & & &个数 &据库。SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的3 个函数,
什么是 ContentValues 类?
&& & ContentValues 类和Hashmap/Hashtable 比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个
&& & String 类型,而值都是基本类型。
什么是 Cursor ?
&& & Cursor 在Android 当中是一个非常有用的接口,通过Cursor 我们可以对从数据库查询出来的结果集进行随&&机的读写访问。
OK,基本知识就介绍到这里,下面开始上代码:还是按照我的一贯风格,代码中该解释的地方都已经在代码中及时注释和讲解了!
顺便来张项目截图:
&& & & & & & & &
先给出xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="/apk/res/android"
&&&&android:orientation="vertical" android:layout_width="fill_parent"
&&&&android:layout_height="fill_parent">
&&&&<TextView android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="SQL 练习!(如果你使用的SD卡存储数据方式,为了保证正常操作,请你先点击创建一张表然后再操作)"
&&&&&&&&android:textSize="20sp" android:textColor="#ff0000" android:id="@+id/tv_title" />
&&&&<Button android:id="@+id/sql_addOne" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="插入一条记录"></Button>
&&&&<Button android:id="@+id/sql_check" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="查询数据库"></Button>
&&&&<Button android:id="@+id/sql_edit" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="修改一条记录"></Button>
&&&&<Button android:id="@+id/sql_deleteOne" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="删除一条记录"></Button>
&&&&<Button android:id="@+id/sql_deleteTable" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="删除数据表单"></Button>
&&&&<Button android:id="@+id/sql_newTable" android:layout_width="fill_parent"
&&&&&&&&android:layout_height="wrap_content" android:text="新建数据表单"></Button>
</LinearLayout>
&&&&xml中定义了我们需要练习用到的几个操作按钮,这里不多解释了,下面看java源码:先看我们继承的&SQLiteOpenHelper 类
package com.himi;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
&* @author Himi
&* @解释 此类我们只需要传建一个构造函数 以及重写两个方法就OK啦、
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
&&&&public final static int VERSION = 1;// 版本号
&&&&public final static String TABLE_NAME = "himi";// 表名
&&&&public final static String ID = "id";// 后面ContentProvider使用
&&&&public final static String TEXT = "text";
&&&&public static final String DATABASE_NAME = "Himi.db";
&&&&public MySQLiteOpenHelper(Context context) {
&&&&&&&&// 在Android 中创建和打开一个数据库都可以使用openOrCreateDatabase 方法来实现,
&&&&&&&&// 因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;
&&&&&&&&// 创建成功则返回一个 SQLiteDatabase对象,否则抛出异常FileNotFoundException。
&&&&&&&&// 下面是来创建一个名为"DATABASE_NAME"的数据库,并返回一个SQLiteDatabase对象
&&&&&&&&super(context, DATABASE_NAME, null, VERSION);
&&&&@Override
&&&&// 在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表;
&&&&public void onCreate(SQLiteDatabase db) {
&&&&&&&&String str_sql = "CREATE TABLE " + TABLE_NAME + "(" + ID
&&&&&&&&&&&&&&&&+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
&&&&&&&&// CREATE TABLE 创建一张表 然后后面是我们的表名
&&&&&&&&// 然后表的列,第一个是id 方便操作数据,int类型
&&&&&&&&// PRIMARY KEY 是指主键 这是一个int型,用于唯一的标识一行;
&&&&&&&&// AUTOINCREMENT 表示数据库会为每条记录的key加一,确保记录的唯一性;
&&&&&&&&// 最后我加入一列文本 String类型
&&&&&&&&// ----------注意:这里str_sql是sql语句,类似dos命令,要注意空格!
&&&&&&&&db.execSQL(str_sql);
&&&&&&&&// execSQL()方法是执行一句sql语句
&&&&&&&&// 虽然此句我们生成了一张数据库表和包含该表的sql.himi文件,
&&&&&&&&// 但是要注意 不是方法是创建,是传入的一句str_sql这句sql语句表示创建!!
&&&&@Override
&&&&public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
&&&&&&&&// 一般默认情况下,当我们插入 数据库就立即更新
&&&&&&&&// 当数据库需要升级的时候,Android 系统会主动的调用这个方法。
&&&&&&&&// 一般我们在这个方法里边删除数据表,并建立新的数据表,
&&&&&&&&// 当然是否还需要做其他的操作,完全取决于游戏需求。
&&&&&&&&Log.v("Himi", "onUpgrade");
我喜欢代码中立即附上解释,感觉这样代码比较让大家更容易理解和寻找,当然如果童鞋们不喜欢,可以告诉我,我改~嘿嘿~
下面看最重要的MainActivity中的代码:
package com.himi;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
// ------------第三种保存方式--------《SQLite》---------
&* @author Himi
&* @保存方式:SQLite 轻量级数据库、
&* @优点: 可以将自己的数据存储到文件系统或者数据库当中, 也可以将自己的数据存
&* 储到SQLite数据库当中,还可以存到SD卡中
&* @注意1:数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,
&* 数据库的名字也是唯一的。
&* @注意2 apk中创建的数据库外部的进程是没有权限去读/写的,
&* 我们需要把数据库文件创建到sdcard上可以解决类似问题.
&* @注意3 当你删除id靠前的数据或者全部删除数据的时候,SQLite不会自动排序,
&* 也就是说再添加数据的时候你不指定id那么SQLite默认还是在原有id最后添加一条新数据
&* @注意4 android 中 的SQLite 语法大小写不敏感,也就是说不区分大小写;
public class MainActivity extends Activity implements OnClickListener {
&&&&private Button btn_addOne, btn_deleteone, btn_check, btn_deleteTable,
&&&&&&&&&&&&btn_edit, btn_newTable;
&&&&private TextView tv;
&&&&private MySQLiteOpenHelper myOpenHelper;// 创建一个继承SQLiteOpenHelper类实例
&&&&private SQLiteDatabase mysql ;
//---------------以下两个成员变量是针对在SD卡中存储数据库文件使用
//&&&&private File path = new File("/sdcard/himi");// 创建目录
//&&&&private File f = new File("/sdcard/himi/himi.db");// 创建文件
&&&&@Override
&&&&public void onCreate(Bundle savedInstanceState) {
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
&&&&&&&&&&&&&&&&WindowManager.LayoutParams.FLAG_FULLSCREEN);
&&&&&&&&this.requestWindowFeature(Window.FEATURE_NO_TITLE);
&&&&&&&&setContentView(R.layout.main);
&&&&&&&&tv = (TextView) findViewById(R.id.tv_title);
&&&&&&&&btn_addOne = (Button) findViewById(R.id.sql_addOne);
&&&&&&&&btn_check = (Button) findViewById(R.id.sql_check);
&&&&&&&&btn_deleteone = (Button) findViewById(R.id.sql_deleteOne);
&&&&&&&&btn_deleteTable = (Button) findViewById(R.id.sql_deleteTable);
&&&&&&&&btn_newTable = (Button) findViewById(R.id.sql_newTable);
&&&&&&&&btn_edit = (Button) findViewById(R.id.sql_edit);
&&&&&&&&btn_edit.setOnClickListener(this);
&&&&&&&&btn_addOne.setOnClickListener(this);
&&&&&&&&btn_check.setOnClickListener(this);
&&&&&&&&btn_deleteone.setOnClickListener(this);
&&&&&&&&btn_deleteTable.setOnClickListener(this);
&&&&&&&&btn_newTable.setOnClickListener(this);
&&&&&&&&myOpenHelper = new MySQLiteOpenHelper(this);// 实例一个数据库辅助器
//备注1 ----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
//&&&&&&&&if (!path.exists()) {// 目录存在返回false
//&&&&&&&&&&&&path.mkdirs();// 创建一个目录
//&&&&&&&&}
//&&&&&&&&if (!f.exists()) {// 文件存在返回false
//&&&&&&&&&&&&try {
//&&&&&&&&&&&&&&&&f.createNewFile();//创建文件
//&&&&&&&&&&&&} catch (IOException e) {
//&&&&&&&&&&&&&&&&// TODO Auto-generated catch block
//&&&&&&&&&&&&&&&&e.printStackTrace();
//&&&&&&&&&&&&}
//&&&&&&&&}
&&&&@Override
&&&&public void onClick(View v) {
&&&&&&&&try {
//备注2----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
//&&&&&&&&&&&& mysql = SQLiteDatabase.openOrCreateDatabase(f, null);
//备注3--- 如果想把数据库文件默认放在系统中,那么创建数据库mysql如下操作:
&&&&&&&&&&&&&&&&mysql = myOpenHelper.getWritableDatabase(); // 实例数据库
&&&&&&&&&&&&if (v == btn_addOne) {// 添加数据
&&&&&&&&&&&&&&&&// ---------------------- 读写句柄来插入---------
&&&&&&&&&&&&&&&&// ContentValues 其实就是一个哈希表HashMap, key值是字段名称,
&&&&&&&&&&&&&&&&//Value值是字段的值。然后 通过 ContentValues 的 put 方法就可以
&&&&&&&&&&&&&&&&//把数据放到ContentValues中,然后插入到表中去!
&&&&&&&&&&&&&&&&ContentValues cv = new ContentValues();
&&&&&&&&&&&&&&&&cv.put(MySQLiteOpenHelper.TEXT, "测试新的数据");
&&&&&&&&&&&&&&&&mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
&&&&&&&&&&&&&&&&// inser() 第一个参数 标识需要插入操作的表名
&&&&&&&&&&&&&&&&// 第二个参数 :默认传null即可
&&&&&&&&&&&&&&&&// 第三个是插入的数据
&&&&&&&&&&&&&&&&// ---------------------- SQL语句插入--------------
&&&&&&&&&&&&&&&&// String INSERT_DATA =
&&&&&&&&&&&&&&&&// "INSERT INTO himi (id,text) values (1, '通过SQL语句插入')";
&&&&&&&&&&&&&&&&// db.execSQL(INSERT_DATA);
&&&&&&&&&&&&&&&&tv.setText("添加数据成功!点击查看数据库查询");
&&&&&&&&&&&&} else if (v == btn_deleteone) {// 删除数据
&&&&&&&&&&&&&&&&// ---------------------- 读写句柄来删除
&&&&&&&&&&&&&&&&mysql.delete("himi", MySQLiteOpenHelper.ID + "=1", null);
&&&&&&&&&&&&&&&&// 第一个参数 需要操作的表名
&&&&&&&&&&&&&&&&// 第二个参数为 id+操作的下标 如果这里我们传入null,表示全部删除
&&&&&&&&&&&&&&&&// 第三个参数默认传null即可
&&&&&&&&&&&&&&&&// ----------------------- SQL语句来删除
&&&&&&&&&&&&&&&&// String DELETE_DATA = "DELETE FROM himi WHERE id=1";
&&&&&&&&&&&&&&&&// db.execSQL(DELETE_DATA);
&&&&&&&&&&&&&&&&tv.setText("删除数据成功!点击查看数据库查询");
&&&&&&&&&&&&} else if (v == btn_check) {// 遍历数据
//备注4------
&&&&&&&&&&&&&&&&Cursor cur = mysql.rawQuery("SELECT * FROM "
&&&&&&&&&&&&&&&&&&&&&&&&+ MySQLiteOpenHelper.TABLE_NAME, null);
&&&&&&&&&&&&&&&&if (cur != null) {
&&&&&&&&&&&&&&&&&&&&String temp = "";
&&&&&&&&&&&&&&&&&&&&int i = 0;
&&&&&&&&&&&&&&&&&&&&while (cur.moveToNext()) {//直到返回false说明表中到了数据末尾
&&&&&&&&&&&&&&&&&&&&&&&&temp += cur.getString(0);
&&&&&&&&&&&&&&&&&&&&&&&&// 参数0 指的是列的下标,这里的0指的是id列
&&&&&&&&&&&&&&&&&&&&&&&&temp += cur.getString(1);
&&&&&&&&&&&&&&&&&&&&&&&&// 这里的0相对于当前应该是咱们的text列了
&&&&&&&&&&&&&&&&&&&&&&&&i++;
&&&&&&&&&&&&&&&&&&&&&&&&temp += " "; // 这里是我整理显示格式 ,呵呵~
&&&&&&&&&&&&&&&&&&&&&&&&if (i % 3 == 0) // 这里是我整理显示格式 ,呵呵~
&&&&&&&&&&&&&&&&&&&&&&&&&&&&temp += "/n";// 这里是我整理显示格式 ,呵呵~
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&tv.setText(temp);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&} else if (v == btn_edit) {// 修改数据
&&&&&&&&&&&&&&&&// ------------------------句柄方式来修改 -------------
&&&&&&&&&&&&&&&&ContentValues cv = new ContentValues();
&&&&&&&&&&&&&&&&cv.put(MySQLiteOpenHelper.TEXT, "修改后的数据");
&&&&&&&&&&&&&&&&mysql.update("himi", cv, "id " + "=" + Integer.toString(3), null);
&&&&&&&&&&&&&&&&// ------------------------SQL语句来修改 -------------
&&&&&&&&&&&&&&&&// String UPDATA_DATA =
&&&&&&&&&&&&&&&&// "UPDATE himi SET text='通过SQL语句来修改数据' WHERE id=1";
&&&&&&&&&&&&&&&&// db.execSQL(UPDATA_DATA);
&&&&&&&&&&&&&&&&tv.setText("修改数据成功!点击查看数据库查询");
&&&&&&&&&&&&} else if (v == btn_deleteTable) {// 删除表
&&&&&&&&&&&&&&&&mysql.execSQL("DROP TABLE himi");
&&&&&&&&&&&&&&&&tv.setText("删除表成功!点击查看数据库查询");
&&&&&&&&&&&&} else if (v == btn_newTable) {// 新建表
&&&&&&&&&&&&&&&&String TABLE_NAME = "himi";
&&&&&&&&&&&&&&&&String ID = "id";
&&&&&&&&&&&&&&&&String TEXT = "text";
&&&&&&&&&&&&&&&&String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
&&&&&&&&&&&&&&&&&&&&&&&&+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
&&&&&&&&&&&&&&&&&&&&&&&&+ " text );";
&&&&&&&&&&&&&&&&mysql.execSQL(str_sql2);
&&&&&&&&&&&&&&&&tv.setText("新建表成功!点击查看数据库查询");
&&&&&&&&&&&&}
&&&&&&&&&&&&// 删除数据库:
&&&&&&&&&&&&// this.deleteDatabase("himi.db");
&&&&&&&&} catch (Exception e) {
&&&&&&&&&&&&tv.setText("操作失败!");
&&&&&&&&} finally {// 如果try中异常,也要对数据库进行关闭
&&&&&&&&&&&&mysql.close();
以上代码中我们实现了两种存储方式:
&& & & &一种存储默认系统路径/data-data-com.himi-databases下,另外一种则是保存在了/sdcard-himi下,生成数据库文件himi.db
那么这里两种实现方式大概步骤和区别说下:
-----------如果我们使用默认系统路径存储数据库文件:
&& &第一步:新建一个类继承SQLiteOpenH写一个构造,重写两个函数!
&& &第二步:在新建的类中的onCreate(SQLiteDatabase db) 方法中创建一个表;
&& &第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;
&& &注意:&继承写这个辅助类,是为了在我们没有数据库的时候自动为我们生成一个数据库,并且生成数据库文件,这里也同时创建了一张表,因为我们在onCreate里是在数据库中创建一张表的操作;这里还要注意在我们new 这个我们这个MySQLiteOpenHelper 类实例对象的时候并没有创建数据库哟~!而是在我们调用&(备注3)MySQLiteOpenHelper ..getWritableDatabase() 这个方法得到数据库读写句柄的时候,android 会分析是否已经有了数据库,如果没有会默认为我们创建一个数据库并且在系统路径data-data-com.himi-databases下生成himi.db 文件!
(如果我们使用sd卡存储数据库文件,就没有必要写这个类了,而是我们自己Open自己的文件得到一个数据库,西西,反而方便~ )
-----------如果我们需要把数据库文件存储到SD卡中:
&& & &第一步:确认模拟器存在SD卡,关于SD卡的两种创建方法见我的博文:【Android 2D游戏开发之十】
&& & &第二步:(备注1)先创建SD卡目录和路径已经我们的数据库文件!这里不像上面默认路径中的那样,如果没有数据库会默认系统路径生成一个数据库和一个数据库文件!我们必须手动创建数据库文件!
&& &第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;(备注2)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的文件得到数据库实例。这里仅仅是创建一个数据库!!!!
&& &第四步:在进行删除数据、添加数据等操作的之前我们还要创建一个表!
&& &第五步:在配置文件AndroidMainfest.xml 声明写入SD卡的权限,上一篇已经介绍权限了,不知道的自己去看下吧。
&& & 有些童鞋不理解什么默认路径方式中就有表?那是因为我们在它默认给我们创建数据库的时候我们有创建表的操作,就是MySQLiteOpenHelper类中的onCreate()方法里的操作!所以我们如果要在进行删除数据、添加数据等操作的之前还要创建一个表,创建表的方法都是一样的。
总结:不管哪种方式我们都要-创建数据库-创建表-然后进行操作!
&& & &&&在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
&以下是方法和说明:
&move 以当前的位置为参考,将Cursor移动到指定的位置,成功返回true, 失败返回false
&moveToPosition 将Cursor移动到指定的位置,成功返回true,失败返回false
&moveToNext &将Cursor向前移动一个位置,成功返回true,失败返回false
&moveToLast 将Cursor向后移动一个位置,成功返回true,失败返回 false。
&movetoFirst &将Cursor移动到第一行,成功返回true,失败返回false
&isBeforeFirst &返回Cursor是否指向第一项数据之前
&isAfterLast &返回Cursor是否指向最后一项数据之后
&isClosed & &返回Cursor是否关闭
&isFirst 返回Cursor是否指向第一项数据
&isLast && & &返回Cursor是否指向最后一项数据
&isNull && & &返回指定位置的值是否为null
&getCount & & 返回总的数据项数
&getInt & & & & &返回当前行中指定的索引数据
对于SQLite的很多童鞋有接触过,但是就不知道怎么存储在SD中,所以我也研究了下,这篇也写了把sd卡中的方式也提供给大家。
阅读(5904) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。&&等android内嵌的SQLite创建数据库,在哪里查看?使用Android内嵌的SQLite创建了数据库,并建立一张表,怎么查看?1个牛币所有回答列表(2)首先 数据库文件一般放在 &data/data/{你的应用包名}/database/ 文件夹下。第一种:& 1、装逼方式,可实时更新: 确保设备已经root。假如你已经通过代码新建了一个数据库叫test.db,并且新建了一张表叫 table_user。OK, 打开终端(windows 运行-&cmd&) 输入 adb shell,前提你已经配置过adb 的环境变量(mac 和 Windows 配置方法请自行百度),然后回车。这是时候就会进入 Linux的命令模式。然后cd 到&data/data/{你的应用包名}/database/ 目录,ls 下,你会发现, 你所创建的test.db的数据库就出来了。OK,然后在终端输入&sqlite3 test.db 回车,进入sqlite 命令,好了,精彩的时刻就要到了,比如我们要查看test.db 下有哪些表,我们用 .tables 命令 &回车,哎呀呀, table_user 就出现了。&其实在 终端输入的 sqlite3 命令之后,你就可以输入sql 语句了:比如 select * from table_user 等sql 语句。& 2、直观模式,不可实时更新:请root你的设备,因为 data/data/ 下的文件及文件夹需要root才能可见。同样,假如你已经通过代码新建了一个数据库叫test.db,并且新建了一张表叫 table_user。OK,我们可以通过ADM(Android Device Monitor) 的 DDMS 的File explorer 直接进入&data/data/{你的应用包名}/database/ 目录,把test.db 文件push 出来,然后可通过软件&查看,或者 通过 root explorer 文件管理器,进入data/data/{你的应用包名}/database/ 目录,打开test.db , 这个方法需要手机上装个能够查看数据库的软件哦。希望对你有用!纯手打,好累。。。&LV3你可以使用navicat for sqlite工具啊或者是Navicat Premium,默认的数据库app安装后会在a安装目录中等等等等完等完等等等等等最热搜索问答话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关问答等等等等完等等等完等等完最近浏览暂无贡献等级暂无贡献等级&LV3&LV4扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友1478人阅读
Android(55)
问题来源:android下的sqlite数据库一般都是单机的,当一个应用中数据库的数据多的时候,每换一个机子都重新配置一下数据库中所有数据显然是浪费时间的,所以最好的办法就是可以访问一个已经存在的数据库。
解决方案:
方案一:在Eclipse中操作,仅仅限于模拟器使用。
在Eclipse打开File Explorer视图, File Explorer是用来查看设备的文件的, 打开方式为在Eclipse中执行【Window】-【Show View】-【other】-【File Explorer】操作。
找到要导入文件的位置,也就是数据库默认的位置/data/data/&包名&/database目录。
选中目录,然后点右上角位置的设备图标【Pull a file from the device】,然后选择要上传的数据库即可。
图示如下:
方案二:将数据库放到res/raw目录下,在第一次数据访问数据库时拷贝纸/data/data/&包名&/database目录下,模拟器和真机都适用。
拷贝的代码如下:
String filePath = context.getCacheDir().getAbsolutePath();
String DATABASE_PATH = filePath.substring(0, filePath.length() - 5)
+ "databases";
String DATABASE_FILENAME = "usmartscada.db";
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
if (!dir.exists()) {
dir.mkdir();
if (!(new File(databaseFilename)).exists()) {
InputStream is = context.getResources().openRawResource(R.raw.usmartscada);;
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) & 0) {
fos.write(buffer, 0, count);
fos.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
上面的代码例子数据库的名字为usmartscada.db ,同时证明了复制进来的数据库可以正常进行读取和写入,不存在权限不够不能读取和写入的问题, 但是上面的代码会有几个问题。
为什么要把已存在数据库文件放在res/raw文件夹下, 放在其它地方可以吗?
如果放在res/raw文件夹下,数据库文件在apk打包的时候就必须确定并且不可更改,否则每次都要重新编译生成apk,在使用的时候会很麻烦,所以最好是将数据库文件放置在sd卡的某个位置。
经过验证得知,数据库文件可以放置到其它位置,例如sd卡的某个位置,至于放在什么位置根据具体情景来觉得,上面的代码只是一个例子而已,当然放在不同的位置,访问文件的时候的方式也不一样。当然注意要访问sd卡的时候一定要在AndroidManifest.xml文件中添加访问sd卡的权限。
上面的代码没有判断已存在的数据库文件是否存在?一是为了代码的严谨性考虑,二是因为在特殊的机子上可能不需要之前已经存在的数据库,希望自己配置并生成数据库,此时就不需要复制之前的数据库。
这个问题根据实际情景来决定是否需要判断已存在的数据库文件是否存在,判断的时候根据数据库文件放置的位置不同而不同,另外如果防止在res/raw文件夹下没有办法判断数据库文件是否存在,因为访问res/raw文件夹下的文件使用的方法是R.raw.xxx,如果文件不存在,没办法得到数据库文件的对象,所以也就没办法判断,补充一个知识res/raw文件夹下的文件的绝对路径是”android.resource://”+
getPackageName() + R.raw.xxx。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:157793次
积分:2651
积分:2651
排名:第11816名
原创:106篇
转载:42篇
评论:13条
(2)(1)(3)(5)(1)(1)(5)(5)(4)(1)(1)(5)(14)(5)(4)(9)(11)(2)(3)(9)(7)(10)(19)(21)

我要回帖

更多关于 sqlite打开数据库文件 的文章

 

随机推荐