请问各位大侠,如何编程实现将外部数据库(PC机上的sqlite 类型的.db文件)还原到android模拟器上啊?我是个完全的彻底的菜鸟,希望各位大侠帮忙啊!谢谢各位高手了!

解决方案 »

  1.   


    程序在第一次启动的时候,会把数据库安装到内存卡上面,从而可以读却数据库。
    相关的代码:package com.easymorse; import java.io.File; 
    import java.io.FileOutputStream; 
    import java.io.InputStream; import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.database.Cursor; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.os.Bundle; 
    import android.text.Editable; 
    import android.text.TextWatcher; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.AutoCompleteTextView; 
    import android.widget.Button; public class Dictionary extends Activity  implements OnClickListener, TextWatcher{ 
        private final String DATABASE_PATH = android.os.Environment 
                .getExternalStorageDirectory().getAbsolutePath() 
                + "/dictionary"; 
        private final String DATABASE_FILENAME = "dictionary.db3"; 
        SQLiteDatabase database; 
        Button btnSelectWord; 
        AutoCompleteTextView actvWord; 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
            // 打开数据库,database是在Main类中定义的一个SQLiteDatabase类型的变量 
            database = openDatabase(); 
            // 下面的代码装载了相关组件,并设置了相应的事件 
            btnSelectWord = (Button) findViewById(R.id.btnSelectWord); 
            actvWord = (AutoCompleteTextView) findViewById(R.id.actvWord); 
            btnSelectWord.setOnClickListener(this); 
            actvWord.addTextChangedListener(this); 
        } 
        public void onClick(View view) 
        { 
            //  查找单词的SQL语句 
            String sql = "select chinese from t_words where english=?";    
            Cursor cursor = database.rawQuery(sql, new String[] 
            { actvWord.getText().toString() }); 
            String result = "未找到该单词."; 
            //  如果查找单词,显示其中文信息 
            if (cursor.getCount() > 0) 
            { 
                //  必须使用moveToFirst方法将记录指针移动到第1条记录的位置 
                cursor.moveToFirst(); 
                result = cursor.getString(cursor.getColumnIndex("chinese")); 
                Log.i("tran", "success"+result); 
            } 
            //  显示查询结果对话框 
            new AlertDialog.Builder(this).setTitle("查询结果").setMessage(result) 
                    .setPositiveButton("关闭", null).show();     }     private SQLiteDatabase openDatabase() { 
            try { 
                // 获得dictionary.db文件的绝对路径 
                String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 
                File dir = new File(DATABASE_PATH); 
                // 如果/sdcard/dictionary目录中存在,创建这个目录 
                if (!dir.exists()) 
                    dir.mkdir(); 
                // 如果在/sdcard/dictionary目录中不存在 
                // dictionary.db文件,则从res\raw目录中复制这个文件到 
                // SD卡的目录(/sdcard/dictionary) 
                if (!(new File(databaseFilename)).exists()) { 
                    // 获得封装dictionary.db文件的InputStream对象 
                    InputStream is = getResources().openRawResource( 
                            R.raw.dictionary); 
                    FileOutputStream fos = new FileOutputStream(databaseFilename); 
                    byte[] buffer = new byte[8192]; 
                    int count = 0; 
                    // 开始复制dictionary.db文件 
                    while ((count = is.read(buffer)) > 0) { 
                        fos.write(buffer, 0, count); 
                    }                 fos.close(); 
                    is.close(); 
                } 
                // 打开/sdcard/dictionary目录中的dictionary.db文件 
                SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( 
                        databaseFilename, null); 
                return database; 
            } catch (Exception e) { 
            } 
            return null; 
        } 
        @Override 
        public void afterTextChanged(Editable s) { 
        } 
        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, 
                int after) { 
        } 
        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) { 
        } }
      

  2.   

    首先,谢谢楼主啊,不过,你的这个好像是查找单词的数据库吧,我想问一下,我想把PC机上的/F/contact.db文件还原到android模拟器应该怎么做呢?我还原到android模拟器上能准确显示里面的内容吧?我是个彻底的菜鸟,希望我描述清楚了,有什么错误还望各位大侠给予指正,感激不尽!
      

  3.   

    adb push <本地路径> <远程路径>
      

  4.   

    adb push yourfile /system/apps
      

  5.   

     adb push F:/contact.db /sdcard/system/apps
              参考下面介绍:
    adb+push上载文件到SD存储卡使用Android仿真器加上-sdcard指令装入SD存储卡后,似乎一切都没有发生。其实不然,Android是Linux操作系统的一种,它将SD存储卡挂接(mount)在系统的/sdcard目录中,我们要访问SD存储卡,是无法直接在Android emulator的手机中来完成的,Android的仿真器并没有资源管理器可以做一般操作系统上的复制删除文件动作,一切必须靠adb (Android Debug Bridge) 指令来完成。现在必须开启另外一个终端机窗口,然后运行Android SDK tools目录底下的adb指令加上push参数,将计算机中的文件复制到刚刚制作好的SD存储卡图像档中,指令如下:
    adb push 001.jpg /sdcard            (复制001.jpg文件到 /sdcard 目录下)  adb push pictures /sdcard           (复制pictures照片目录到 /sdcard 目录下)  adb push mp3 /sdcard                (复制mp3音乐目录到 /sdcard 目录下) 复制好文件后,您必须运行adb shell指令进入Android系统,然后使用Linux系统的ls与cd指令浏览/sdcard存储卡文件。adb shell                       (Android仿真器启动命令列模式)  # cd /sdcard                        (进入 /sdcard目录)  # ls                            (查看SD存储卡中的文件) 如果成功的话,则已经将计算机中的文件复制到Android系统的SD存储卡了
      

  6.   

    楼上的高手,请问您一下,能不能用代码的方式实现将PC上的文件拷贝到android模拟器上的sd卡中然后在通过代码实现在模拟器上的显示啊?我在网上看到了关于导入外部数据库的有关代码。android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.请问这个可以吗?
      

  7.   

    // 打开/sdcard/dictionary目录中的dictionary.db文件 
                SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( 
                        databaseFilename, null); 
                return database; 
            } catch (Exception e) { 
            } 
            return null; 这不是打开吗?
    你手动把db复制到/sdcard/dictionary目录中就行了
      

  8.   

    我用了adp push,但是我只能看到apps,不能看到里面的内容了,当我用 cd apps时提示can‘t cd to apps。楼上的大侠,我能加你QQ聊吗?谢谢你了!
      

  9.   

    Android仿真器启用SD存储卡的方法不论是听MP3音乐或是浏览图片,Android手机的保存媒介就是常用的Micro SD存储卡。若想在Android仿真器播放音乐或者看数位相片,就必须先仿真出SD存储卡,并让Android仿真器能够访问仿真出来的SD存储卡。Android SDK组件的tools目录里,除了emulator这个运行文件外,另外放置mksdcard这个程序,它可以仿真出您所需要的SD存储卡空间,例如使用mksdcard指令仿真出1 GB的存储卡,指令如下:mksdcard 1024M sdcard.img 经过一小段的硬盘读取时间后,就会在Android SDK tools/ 目录下生成一个文件大小为1GB的sdcard.img文件,也可以依照自己的需要更改1 024 MB为其他数字,制造出自己所需的存储卡大小,例如4 096 MB (4 GB) 或8 192 MB (8 GB)。然后我们以emulator指令启动Android仿真器时,必须添加-sdcard参数指定该sdcard.img存储卡文件,就可以让Android仿真器拥有插入SD存储卡到T-Mobile G1手机的仿真效果。emulator -sdcard sdcard.img 
    这样试试看?
      

  10.   

    将外部数据库(PC机上的sqlite 类型的.db文件)还原到android模拟器上直接通过adb复制进模拟器就行了?还是想要?
      

  11.   

    我的项目是这样的:从手机中的全部文件都打包备份到电脑上面,然后再从电脑上面还原到android模拟器上面,实现和真机上面的一样,然后通过像在真机上面一样能够查看通话记录,短信内容,等等,还要实现通过不需要密码直接可以登录QQ查看聊天内容,这个是手机取证的项目,是向犯罪嫌疑人取证的。我的问题是:如何将打包到电脑上的那些文件还原到android模拟器上面运行,用编程语言实现!希望我描述清楚了,希望高手给予帮助,谢谢!
      

  12.   

    可以。我之前手机点了重启,然后一直重启,我就用adb连上去,把联系人和短信的数据库pull出来,刷机后扔回进去既然这样可以,那么用代码也可以实现短信内容,通话记录什么的,你直接把数据库放在sdcard上,获取里面的数据,然后通过系统提供的短信provider,通话记录provider等insert进去即可(手机卫士短信备份联系人备份就是这么干的)至于qq的db,我印象中是没有加密的。。你可以试下把腾讯qq的数据库导出到pc上,用SQLite Expert Personal打开看看,能打开就是没加密,不能打开的话,查看qq聊天记录似乎有点难一句话,研究sqlite的数据库表结构
      

  13.   

    如果你的项目只要把数据库资料获取到的话,直接用SQLite Expert Personal打开就可以查询了= =
      

  14.   


    这个就跟android上开发没啥关联了吧,
    一是你直接在电脑上用Sqlite数据库管理的工具直接可以看了,
    二是直接写一个adb操作的批处理复制到模拟器就行了,把相应apk装进模拟器就可以看了