2010-07-27 71 views
0

当我尝试在黑莓EclipsePlugin 1.1黑莓和SQLite

即时得到

net.rim.device.api.database.DatabaseIOException运行下面的代码:文件系统错误(12)错误和我Sqlite DB位于项目的资源文件夹中。

我已经在模拟器

添加SD卡所以,请帮我解决这个错误,我也着复制现有的数据库到SD卡。

package com.bb.readdb; 

/* 
* ReadData.java 
* 
* Research In Motion Limited proprietary and confidential 
* Copyright Research In Motion Limited, 2010 
*/ 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Enumeration; 

import javax.microedition.io.Connector; 
import javax.microedition.io.file.FileConnection; 
import javax.microedition.io.file.FileSystemRegistry; 

import net.rim.device.api.database.Database; 
import net.rim.device.api.database.DatabaseException; 
import net.rim.device.api.database.DatabaseFactory; 
import net.rim.device.api.database.DatabaseSecurityOptions; 
import net.rim.device.api.database.Row; 
import net.rim.device.api.database.Statement; 
import net.rim.device.api.io.URI; 
import net.rim.device.api.system.CodeModuleManager; 
import net.rim.device.api.system.CodeSigningKey; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.Dialog; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.RichTextField; 
import net.rim.device.api.ui.container.MainScreen; 
public class Readdbdata extends UiApplication 
{ 
    //public String nydb="nycway232128.db"; 
public static void main(String[] args) 
{ 
Readdbdata theApp = new Readdbdata(); 
theApp.enterEventDispatcher(); 
} 
public Readdbdata() 
{ 
pushScreen(new ReadDataScreen()); 
} 
} 
class ReadDataScreen extends MainScreen 
{ 
Database d; 
public ReadDataScreen() 
{ 
LabelField title = new LabelField("SQLite Read Table Data Sample", 
LabelField.ELLIPSIS | 
LabelField.USE_ALL_WIDTH); 
setTitle(title); 
add(new RichTextField("Attempting to retrieve data from " +"Mypeople.db on the SDCard.")); 
try 
{ 
    String nydb="nycway232128.db"; 
URI myURI = URI.create("file:///SDCard/databases/NycWay/" +"Mypeople.db"); 
d = DatabaseFactory.openOrCreate(myURI); 
//Statement st = d.createStatement("SELECT Name FROM gross "); 


//st.prepare(); 
//st.execute(); 
//st.close(); 
//d.close(); 
boolean sdCardPresent = false; 
String root = null; 
Enumeration e = FileSystemRegistry.listRoots(); 
copyFile("Mypeople", "file:///SDCard/databases/NycWay/"); 

DatabaseFactory.open(myURI); 
Statement st = d.createStatement("SELECT Name FROM People "); 
st.prepare(); 
st.close(); 

d.close(); 
} 
catch (Exception e) 
{ 
System.out.println("@@@@@@@@@NYC IKnwdf [email protected]@@@@@@@@@@@"+e.toString()); 
e.printStackTrace(); 
} 

} 
public void copyFile(String srFile, String dtFile) 
{ 
    try 
    { 

     FileConnection fconn; 


     fconn = (FileConnection) Connector.open(dtFile,Connector.READ_WRITE); 

     if(!fconn.exists()) // if file does not exists , create a new one 
     { 
      fconn.create(); 
     } 
     InputStream is = getClass().getResourceAsStream(srFile); 
     OutputStream os =fconn.openOutputStream(); 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = is.read(buf)) > 0) 
     { 
      os.write(buf, 0, len); 
     } 
     is.close(); 
     os.close(); 
    } 
    catch(IOException e) 
    { 

    } 
} 
public void readAndWriteDatabaseFile(FileConnection fileConnection) throws IOException 
{ 
    OutputStream outputStream = null; 
    InputStream inputStream = null;  

    // Open an input stream to the pre-defined encrypted database bundled 
    // within this module. 
    String nydb="Mypeople"; 
    {   
     /*\*/ 
    inputStream = getClass().getResourceAsStream("/" + nydb); 

    // Open an output stream to cthe newly created file 
    outputStream = (OutputStream)fileConnection.openOutputStream();          

    // Read data from the input stream and write the data to the 
    // output stream.    
    byte[] data = new byte[256]; 
    int length = 0; 
    while (-1 != (length = inputStream.read(data))) 
    { 
     outputStream.write(data, 0, length);     
    }  

    // Close the connections 
    if(fileConnection != null) 
    { 
     fileConnection.close(); 
    } 
    if(outputStream != null) 
    { 
     outputStream.close(); 
    } 
    if(inputStream != null) 
    { 
     inputStream.close(); 
    }    
} 

} 


} 

回答

2

您有请确保您有密切的所有输入/文件的输出流,你也有打电话给DatabaseFactory.open()之前关闭文件;

希望这有助于

0

如果你想打开一个数据库既是读写和开放 它为只读第一读写。 已打开(以读写或只读方式)时尝试打开数据库 将生成“文件系统错误12”,这表示存在尝试打开多个数据库的 读写连接到同一个 数据库。

发现此描述here。我希望它有助于解决您的问题。