2012-10-27 48 views
0

我已經編寫了使用android中現有數據庫的代碼。在android中使用現有數據庫

我所擁有的是:

  • 數據庫:測試
  • 表:T1

我在asset文件夾中保存我的數據庫,如果我跑我的項目是給我force-close錯誤。

我哪裏錯了?

public class BDAdapter extends SQLiteOpenHelper { 
    private Context mycontext; 
int id=0; 
     private String DB_PATH = "data/data/com.example.dd9/databases/"; 
     private static String DB_NAME = "test.sqlite"; 
    // public static final String KEY_ROWID = "_id"; 
     public static final String KEY_QUOTE = "name"; 
     private static final String DATABASE_TABLE = "t1"; 
     private static final String TAG = "BDAdapter"; 
     private static final String DATABASE_CREATE = 
       "create table t1 (" 
       + "name text not null);"; 

     private SQLiteDatabase db; 



     public BDAdapter(Context context) { 
      super(context, DB_NAME, null, 1); 
      this.mycontext = context; 
      boolean dbexist = checkdatabase(); 
      if (dbexist) { 
      } else { 
       System.out.println("Database doesn't exist"); 
       try { 
        createdatabase(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     } 

     public void createdatabase() throws IOException { 
      boolean dbexist = checkdatabase(); 
      if (dbexist) { 
      } else { 
       this.getReadableDatabase(); 
       try { 
        copydatabase(); 
       } catch (IOException e) { 
        throw new Error("Error copying database"); 
       } 
      } 
     } 

     private boolean checkdatabase() { 
      boolean checkdb = false; 
      try { 
       String myPath = DB_PATH + DB_NAME; 
       File dbfile = new File(myPath); 
       checkdb = dbfile.exists(); 
      } catch (SQLiteException e) { 
       System.out.println("Database doesn't exist"); 
      } 

      return checkdb; 
     } 

     private void copydatabase() throws IOException { 

      // Open your local db as the input stream 
      InputStream myinput = mycontext.getAssets().open(DB_NAME); 

      // Path to the just created empty db 
      @SuppressWarnings("unused") 
      String outfilename = DB_PATH + DB_NAME; 

      // Open the empty db as the output stream 
      OutputStream myoutput = new FileOutputStream(
        "data/data/com.example.dd9/databases/test.sqlite"); 

      // transfer byte to inputfile to outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myinput.read(buffer)) > 0) { 
       myoutput.write(buffer, 0, length); 
      } 

      // Close the streams 
      myoutput.flush(); 
      myoutput.close(); 
      myinput.close(); 

     } 

     public void open() { 
      // Open the database 
      String mypath = DB_PATH + DB_NAME; 
      myDataBase = SQLiteDatabase.openDatabase(mypath, null, 
        SQLiteDatabase.OPEN_READWRITE); 

     } 

     public synchronized void close() { 
      myDataBase.close(); 
      super.close(); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 
      db.execSQL(DATABASE_CREATE); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS t1"); 
      onCreate(db); 


     } 

     public long insertQuote(String Quote) 
     { 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(KEY_QUOTE, Quote); 
      return db.insert(DATABASE_TABLE, null, initialValues); 
     } 

     public int getAllEntries() 
     { 
      Cursor cursor = db.rawQuery(
         "SELECT COUNT(name) FROM t1", null); 
        if(cursor.moveToFirst()) { 
         return cursor.getInt(0); 
        } 
        return cursor.getInt(0); 

     } 

     public String getRandomEntry() 
     { 

      id = getAllEntries(); 
      Random random = new Random(); 
      int rand = random.nextInt(getAllEntries()); 
      if(rand == 0) 
       ++rand; 
      Cursor cursor = db.rawQuery(
         "SELECT name FROM t1 ", null); 
        //"SELECT * FROM tblRandomQuotes",null); 
        if(cursor.moveToFirst()) { 
         return cursor.getString(0); 

        } 
        return cursor.getString(0); 

     } 

     public Cursor getAllTitles() 
     { 
      return db.query(DATABASE_TABLE, new String[] { 

        KEY_QUOTE, 
        }, 
        null, 
        null, 
        null, 
        null, 
        null); 
     } 


} 



//---------------------------Main class------------------------ 

public class MainActivity extends Activity 
{ 
    BDAdapter db = new BDAdapter(this); 
    EditText name; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // Capture our button from layout 
     Button setButton = (Button)findViewById(R.id.go); 
     Button getButton = (Button)findViewById(R.id.genRan); 
     // Register the onClick listener with the implementation above 
     setButton.setOnClickListener(mAddListener); 
     getButton.setOnClickListener(mAddListener); 
    } 

    // Create an anonymous implementation of OnClickListener 
    private OnClickListener mAddListener = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      switch(v.getId()) 
      { 
      case R.id.go: 
       db.open(); 
       long id = 0; 
       // do something when the button is clicked 
       try 
       { 
        name = (EditText)findViewById(R.id.Quote); 
        db.insertQuote(name.getText().toString()); 


        id = db.getAllEntries(); 

        Context context = getApplicationContext(); 
        CharSequence text = "The quote '" + name.getText() + "' was added successfully!\nQuotes Total = " + id; 
        int duration = Toast.LENGTH_LONG; 

        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 
        name.setText(""); 
       } 
       catch (Exception ex) 
       { 
        Context context = getApplicationContext(); 
        CharSequence text = ex.toString() + "ID = " + id; 
        int duration = Toast.LENGTH_LONG; 

        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 
       } 

       db.close(); 
       break; 
      case R.id.genRan: 
       db.open(); 
       //long id1 = 0; 
       // do something when the button is clicked 
       try 
       { 
        //String quote = ""; 
        //quote = db.getRandomEntry(); 
        //Context context = getApplicationContext(); 
        //CharSequence text = quote; 
        //int duration = Toast.LENGTH_LONG; 

        //Toast toast = Toast.makeText(context, text, duration); 
        //toast.show(); 

        db.open(); 
         Cursor c = db.getAllTitles(); 
         if (c.moveToFirst()) 
         { 
          do {   
           DisplayTitle(c); 
          } while (c.moveToNext()); 
         } 
         db.close(); 


       } 
       catch (Exception ex) 
       { 
        Context context = getApplicationContext(); 
        CharSequence text = ex.toString(); 
        int duration = Toast.LENGTH_LONG; 

        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 
       } 
       db.close(); 
      } 
     } 

    }; 
    public void DisplayTitle(Cursor c) 
    { 
     Toast.makeText(this, 
       "NAME: " + c.getString(0) + "\n" , 


       Toast.LENGTH_LONG).show();   
    } 


} 
+0

üdidnt提資產文件夾數據庫路徑複製 –

+0

你怎麼在logcat中看到了什麼? –

回答

0

試試這個:

public class DBHelper extends SQLiteOpenHelper { 

private static String TAG = "DBHelper"; 
private static boolean DEBUG = true; 

private static String PKG; 
private static final String DB_NAME="C&EN.sqlite"; 
private Context mContext; 

private static DBHelper instance; 

public static DBHelper getInstance(Context ctx){ 
    if(instance == null || !ctx.equals(instance.mContext)){ 
     instance = new DBHelper(ctx); 
    } 
    return instance; 

} 

private DBHelper(Context context) { 

    super(context, DB_NAME, null,2); 

    mContext = context; 

    PKG= context.getPackageName(); 
    InputStream iStream; 
    FileOutputStream fos; 
    File file=new File("/data/data/"+PKG+"/databases/"+DB_NAME); 
    if(!file.exists()){ 
     if(DEBUG)Log.i(TAG, "COPYING DATABASE TO PRIVATE FOLDER"); 
     try { 
      iStream=context.getAssets().open(DB_NAME); 
      new File("/data/data/"+PKG+"/databases").mkdirs(); 
      fos=new FileOutputStream(file); 

      byte[] bte =new byte[1024]; 
      while(iStream.read(bte)!=-1){ 
       fos.write(bte); 
      } 
      iStream.close(); 
      fos.close(); 
     } catch (IOException e) { 
      if(DEBUG)Log.i(TAG, "ERROR COPYING THE DATABASE"); 

     } 
     if(DEBUG)Log.i(TAG, "DATABASE SUCCESSFULLY COPIED TO PRIVATE FOLDER"); 
    } 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

} 

}

+0

代碼中的CONSTANTS是什麼? – shadi

+0

只是刪除。再次看到我的帖子,我編輯過。 –

+0

我改變了,但它沒有工作 – shadi