poovannan
poovannan

Reputation: 11

Blackberry and sqlite

When I try run the code below in Blackberry EclipsePlugin 1.1

im getting

net.rim.device.api.database.DatabaseIOException: File system error (12) Error and my Sqlite DB is in resource folder of the Project.

I had added SDCard in the simulator

So please help me to solve this error and I also cant copy Existing DB into SD Card.

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 pre@@@@@@@@@@@@"+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();
    }            
}

}


}

Upvotes: 0

Views: 3288

Answers (2)

Sameer
Sameer

Reputation: 201

If you want to open a database as both read-write and read-only, open it as read-write first. An attempt to open a database as read-write when it is already open (either as read-write or read-only) will generate "File system error 12", which indicates that there was an attempt to open more than one read-write connection to the same database.

Found this description here. I hope it helps solve your problem.

Upvotes: 0

hiennt
hiennt

Reputation: 890

You has make sure you has close all input/output streams of the file, also you has to close the file before calling to DatabaseFactory.open();

Hope this help

Upvotes: 1

Related Questions