自己摸索着在做一个公交查询的应用,写了个openDatabase方法用于打开数据库,在1.5的版本下运行正常,后来要使用Google Map就把模拟器升级到2.2支持Google APIs,但同样是这个方法打开数据库,返回SQLiteDatabase对象就是不成功,大家帮我看看吧,一个人自学也没地方问人去,只能在这求助了public class Main extends ListActivity 
{
 private final String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory()
  .getAbsolutePath();
 private final String DATABASE_FILENAME = "businfo.db";
 private SQLiteDatabase database;
 private View dialogView;
 private View dialogSDView;
 private AutoCompleteTextView actvKeyWord;
 private AutoCompleteTextView actvStartStop;
 private AutoCompleteTextView actvDestination;
 
 private static String[] items = new String[]
                  {"地图浏览","定位当前位置","查找定位","车次查询","站点查询","站站查询","换乘查询"};

    @Override
protected void onListItemClick(ListView l, View view, int position, long id) 
    {
     if(database==null)
     {
     Log.d("database110", "database==null");
     }         
    } @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        database = openDatabase();
       
        List<Map<String,Object>> appItems = new ArrayList<Map<String,Object>>();
        for(int i=0;i<items.length;i++)
        {
         Map<String,Object> appItem = new HashMap<String,Object>();
         appItem.put("Logo", R.drawable.bus1);
         appItem.put("ItemName", items[i]);
         appItems.add(appItem);
        }
        SimpleAdapter itemAdapter = new SimpleAdapter(this,appItems,R.layout.main,
         new String[]{"ItemName","Logo"},
         new int[]{R.id.tvMainItem,R.id.ivLogo});
        setListAdapter(itemAdapter);
    }
    
    private SQLiteDatabase openDatabase()
    {
     try
     {
     String databaseFilename = DATABASE_PATH+"/"+DATABASE_FILENAME;
     Log.d("path110", databaseFilename);
     if(!(new File(databaseFilename).exists()))
     {
     InputStream is = getResources().openRawResource(R.raw.businfo);
    
     FileOutputStream fos = new FileOutputStream(databaseFilename);
     Log.d("message", "2222222222222222222222222");
     byte[] buffer = new byte[8192];
     int count = 0;
     while((count = is.read(buffer))>0)
     {
     fos.write(buffer, 0, count);
     }
     fos.close();
     is.close();
     }
     SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);
     return database;
     }
     catch(Exception e)
     {
     Log.d("message110", e.toString());
     }
     return null;
    }
}
在openDatabase方法中会抛出 java.is.FileNoFoundException:/mnt/sdcard/businfo.db(Permission denied)
,我以为是权限问题,所以在Manifest当中加了句<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> ,但是问题依旧,实在找不出原因了,请大家帮我找找原因吧!!!

解决方案 »

  1.   

    模拟器应该也要个sdcard.img 模拟sdcard吧?
      

  2.   

    为什么要sdcard.img呢  求详解啊
      

  3.   

    这个东西就相当于外置sd卡 你没有自然就没有sd卡了自然就是那个路径找不到文件了
      

  4.   

    Android创建 sdcard
    两种方式一种CMD中ADB命令另外一种IDE种界面
    一、cmd进入tools目录输入mksdcard -l mycard 100M F:\mysdcard.img
    1.mksdcard命令在F盘下新建一个虚拟磁盘给模拟器用,文件名mysdcard后缀可以
     
    自定义如mycard.tank。
    2. 默认单位为k 这里我写的100M 最小要大于9M,最大看你的硬盘,你要100000M我也不反对。
    3. -l命令行参数表示虚拟磁盘的卷标,可以没有该参数。
     
    二、激活sdcard adb命令emulator 
    1.命令行输入:emulator -avd myadvname -sdcard F:\mysdcard.img
     
    三、sdcard中加入内容 cmd
    F:\Android\android-sdk-windows\tools>adb push F:\a.mp3 /sdcard/a.mp3 
    成功后看到
    473 KB/s (0 bytes in 2714583.005s)
    可以在进入模拟器界面中的Music可以看到你的mp3了
    启动模拟时可以看到左上角有一个卡的图标闪过,就说明加载SDCard启动OK了