Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
467 views
in Technique[技术] by (71.8m points)

cordova - PhoneGap(3.4.0) android app with sqlite, its working fine in emulator but not in device

I have created in PhoneGap(3.4.0) android app with sqlite, its working fine in emulator but not working in device. I am using populated database with lots of records. I have googled to much, but not solved my issue. Error is:

SQLitePlugin.executeSql[Batch](): Error=no such table: my_table_name (code 1): , while compiling: SELECT * from my_table_name

My code:

db = window.sqlitePlugin.openDatabase("myDB.sqlite", "1.0", "DB", 4000000);
db.transaction(function(tx) {      
     tx.executeSql("SELECT * from my_table_name", [], function(tx, res)  {                                           
      });
});
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I solved my issue using this, If you are working for emulator then copy your databas using command prompt, I have added myDB.sqlite in asset folder then run

adb push myDB.sqlite /data/data/com.my_app.my_app/databases/myDB.sqlite

For device, just put them in to bundle of app that is assets folder in case of Android . you need myDB.sqlite and file__0/0000000000000001.sqlite files. More....

public void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   super.init();
   try
   {
        String pName = this.getClass().getPackage().getName();
        this.copy("myDB.sqlite","/data/data/"+pName+"/databases/");
        this.copy("0000000000000001.sqlite","/data/data/"+pName+"/app_database/file__0/");
   }
   catch (IOException e)
   {
       e.printStackTrace();
   }

  super.loadUrl(Config.getStartUrl());    
}

void copy(String file, String folder) throws IOException 
{

   File CheckDirectory;
   CheckDirectory = new File(folder);
   if (!CheckDirectory.exists())
   { 
     CheckDirectory.mkdir();
   }

   InputStream in = getApplicationContext().getAssets().open(file);
   OutputStream out = new FileOutputStream(folder+file);
   // Transfer bytes from in to out
   byte[] buf = new byte[1024];
   int len; while ((len = in.read(buf)) > 0) out.write(buf, 0, len);
   in.close(); out.close();

}

For iOS you can use following steps:

Step 1 : Remove the .sqlite extension from the sqlite database. Ex. If we have the database called myDB.sqlite make it only myDB.

Step 2 : Then drag the myDB file to Resource directory in Xcode by choosing the option “Create groups for any added folder” and check the “Copy items into destination group’s folder (if needed)” option while adding reference.

Step 3 : Now use the following code to copy the database into the Document directory inside our application.

-(void) copyDatabase{

   NSFileManager *fileManager = [NSFileManager defaultManager];
   NSError *error;

   NSString *dbPath = [self getDBPath];
   BOOL success = [fileManager fileExistsAtPath:dbPath];

   if(!success) {

     NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"myDB"];
     success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

     if (!success)
       NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
  }
 }

- (NSString *) getDBPath
{

   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
   NSString *documentsDir = [paths objectAtIndex:0];
   return [documentsDir stringByAppendingPathComponent:@"myDB"];
}

Step 4 : Use this code [self copyDatabase]; and call this in the didFinishLaunchingWithOptions(AppDelegate.m ) method like this

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
   [self copyDatabase];
}

Now open the database using following code.

function openDatabase() {
      try{
           if(!!window.openDatabase){
            var openDB = window.sqlitePlugin.openDatabase({name : "myDB"});
           }else{
              navigator.notification.alert("Local database is not supported by your device.");
           }
      }
      catch(error){
         console.log("ERROR:" + error.message);
 }

More detail...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...