2010-04-09 53 views

回答

0

如果您打算创建一个新的SQLite数据库,然后搭配并实施教程中所示的onCreate()方法。

但是,如果您使用的是由其他外部源创建的SQLite数据库,并且您要将其拉下,请将onCreate()方法留空。

2

重要的是,在本教程中,当您调用该文件时,请确保您传递应用程序上下文getApplicationContext(),以便您有权访问正确的资产,否则可能会得到FileNotFound异常。

33

试试这个代码:

public class DataBaseHelper extends SQLiteOpenHelper { 
    private Context mycontext; 

    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; 
    private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db 
    public SQLiteDatabase myDataBase; 
    /*private String DB_PATH = "/data/data/" 
         + mycontext.getApplicationContext().getPackageName() 
         + "/databases/";*/ 

    public DataBaseHelper(Context context) throws IOException { 
     super(context,DB_NAME,null,1); 
     this.mycontext=context; 
     boolean dbexist = checkdatabase(); 
     if (dbexist) { 
      //System.out.println("Database exists"); 
      opendatabase(); 
     } else { 
      System.out.println("Database doesn't exist"); 
      createdatabase(); 
     } 
    } 

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

    private boolean checkdatabase() { 
     //SQLiteDatabase checkdb = null; 
     boolean checkdb = false; 
     try { 
      String myPath = DB_PATH + DB_NAME; 
      File dbfile = new File(myPath); 
      //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE); 
      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 
     String outfilename = DB_PATH + DB_NAME; 

     //Open the empty db as the output stream 
     OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases /(datbasename).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 opendatabase() throws SQLException { 
     //Open the database 
     String mypath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    public synchronized void close() { 
     if(myDataBase != null) { 
      myDataBase.close(); 
     } 
     super.close(); 
    } 

} 
+0

不错,对我来说工作正常; d – 2013-04-19 08:06:32

+3

实际上,在编码时使用mycontext.getApplicationInfo()。dataDir而不是硬编码“/ data/data /(packagename)”。这是获取应用程序数据目录的官方方式。 – wheredidthatnamecomefrom 2014-10-21 14:29:50

6

将旧数据库(old.db)在你的资源文件夹。键入这里面的onCreate()你的活动:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
.... 

//=======Code For copying Existing Database file to system folder for use====// 
    // Copying Existing Database into system folder 
     try { 

      String destPath = "/data/data/" + getPackageName() 
        + "/databases/data.db"; 

      File f = new File(destPath); 
      if(!f.exists()){ 
      Log.v(TAG,"File Not Exist"); 
      InputStream in = getAssets().open("old.db"); 
      OutputStream out = new FileOutputStream(destPath); 

      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = in.read(buffer)) > 0) { 
       out.write(buffer, 0, length); 
      } 
      in.close(); 
      out.close(); 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.v("TAG","ioexeption"); 
      e.printStackTrace(); 
     } 

     DBManager dbManager = new DBManager(this); 
     Log.v(TAG,"Database is there with version: "+dbManager.getReadableDatabase().getVersion()); 
     String sql = "select * from prizes"; 


     SQLiteDatabase db = dbManager.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(sql, null); 
     Log.v(TAG,"Query Result:"+cursor); 


     cursor.close(); 
     db.close(); 
     dbManager.close(); 

.... 

} 

现在你必须做出一个DBManager类的子类SQLiteOpenHelper。插入抽象方法和构造函数。不要忘记在dbHelper的super()中输入正确的数据库名称。

public class DBManager extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String TAG = "DATABASES"; 

public DBManager(Context context) { 
    super(context, "data.db", null, DATABASE_VERSION); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    Log.v(TAG,"On create Called:"+db.getPath()); 
} 

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

现在,您可以通过实例化DBManager来访问数据库。

SQLiteDatabase db = dbManager.getReadableDatabase(); 
Cursor cursor = db.rawQuery(sql, null); 
... 

不要忘记关闭数据库或你会得到一个SQLiteDatabaseNotClosed异常。

db.close(); 
dbManager.close(); 
1

你会想尝试android sqlite asset helper。它为我打开了一个预先存在的db一块蛋糕。

我花了3个小时试图手动完成所有工作,大概花了半个小时。有趣的是,我认为我正在做图书馆为我做的同样的事情,但有些东西丢失了!

0

只能从资源文件夹读取数据库,因为资源文件夹是只读的。如果你需要做更多的操作,如创建,更新,删除,你可以做一个技巧。将资产数据库中的数据库复制到存储中,然后您可以执行任何您想要的操作。

这里是Working with Android Pre Built Database.

一个简单的例子有一个易于使用的库也从资产的文件夹中访问数据库。你可以检查Android SQLiteAssetHelper(https://github.com/jgilfelt/android-sqlite-asset-helper)。祝你好运!

0

您需要将.sqlite数据库转换为.db才能适应Android。

在你的应用首次启动安装

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM); 

后,在随后的发布会

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE); 

只要火SQL查询

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');"); 

取得成果在数组中CSV,JSON,XML

ArrayList<String> rows=new ArrayList<String>(); 
rows=database.sqlEjectCSV("SELECT * FROM food;"); 
for (int i=0;i<rows.size();i++) 
{ 
    //Do stuffs with each row 
} 

您需要为此包含我的库。此处的文档:
https://github.com/sangeethnandakumar/TestTube

相关问题