2015-05-22 42 views
1

我試圖在我的應用程序中使用現有的sqlite數據庫,並在android資產文件夾中放置我的數據庫文件(我通過db瀏覽器爲windows 7操作系統中的sqlite可移植軟件創建的)工作室,我寫了databaseOpenHelper類是這樣的:無法在android studio中從sqlitedabse讀取數據

package com.example.javad.dbproject; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.List; 
public class myDatabaseHelper extends SQLiteOpenHelper { 
private static String DB_PATH = "/data/data/com.example.javad.dbproject/databases/"; 
private static String DB_NAME = "database1.sqlite"; 
public static final String TB_USER = "dataSheet"; 

private SQLiteDatabase myDB; 
private final Context context; 

//constructor 
public myDatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.context = context; 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    //Handle creation tasks, etc. 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //Handle upgrade tasks, etc. 
} 
    @Override 
public synchronized void close() { 
    if(myDB != null) 
     myDB.close(); 
    super.close(); 
} 
//Check if our database already exists 
private boolean checkDataBase() { 
    SQLiteDatabase tempDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     tempDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLiteException e) { 
     Log.e("tle99 - check", e.getMessage()); 
    } 
    if (tempDB != null) 
     tempDB.close(); 
    return tempDB != null ? true : false; 
} 
/*** 
* Copy database from source code assets to device 
* @throws IOException 
*/ 
public void copyDataBase() throws IOException{ 
    try { 
     InputStream myInput = context.getAssets().open(DB_NAME); 
     String outputFileName = DB_PATH + DB_NAME; 
     OutputStream myOutput = new FileOutputStream(outputFileName); 

     byte[] buffer = new byte[1024]; 
     int length; 

     while((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } catch (Exception e) { 
     Log.e("tle99 - copyDatabase", e.getMessage()); 
    } 

} 
/*** 
* Open database 
* @throws SQLException 
*/ 
public void openDataBase() throws SQLException{ 
    String myPath = DB_PATH + DB_NAME; 
    myDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
} 
/*** 
* Check if the database doesn't exist on device, create new one 
* @throws IOException 
*/ 
public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 

    if (dbExist) { 

    } else { 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      Log.e("tle99 - create", e.getMessage()); 
     } 
    } 
} 

public List<String> getAllUsers(){ 
    List<String> listUsers = new ArrayList<String>(); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c; 

    try { 
     c = db.rawQuery("SELECT * FROM " + TB_USER , null); 
     if(c == null) return null; 

     String name; 
     c.moveToFirst(); 
     do { 
      name = c.getString(1); 
      listUsers.add(name); 
     } while (c.moveToNext()); 
     c.close(); 
    } catch (Exception e) { 
     Log.e("tle99", e.getMessage()); 
    } 

    db.close(); 

    return listUsers; 
} 

,我這樣修改主要活動的java文件:

public class MainActivity extends ActionBarActivity { 
myDatabaseHelper dbHeplper; 
ListView lvUsers; 
ListAdapter adapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    dbHeplper = new myDatabaseHelper(getApplicationContext()); 
    try { 
     dbHeplper.createDataBase(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    lvUsers = (ListView) findViewById(R.id.lvUsers); 
    List<String> listUsers = dbHeplper.getAllUsers(); 

    if (listUsers != null) { 
     adapter = new ArrayAdapter<String>(getApplicationContext(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, 
       listUsers); 
     lvUsers.setAdapter(adapter); 

    } 
} 

但是當我運行這個程序,列表視圖不返回任何值我的數據庫和這條消息出現在logcat中:「打開trace fil的錯誤e:沒有這樣的文件或目錄(2)「和」E/SQLiteLog:(1)沒有這樣的表格:dataSheet「

看來,Android工作室無法找到或從我的數據庫文件中讀取信息,Any Ideas歡迎!

這裏是正在運行的應用程序後的logcat消息: http://textuploader.com/p9zt

+0

可以請您發佈您的stacktrace嗎? –

+0

你是指logcat消息嗎? –

+0

是的,請更好地看到它 –

回答

-1

首先,我們需要爲數據庫文件夾創建一個文件夾,然後複製 databaseFile然後它工作正常。

public void copyDataBase() throws IOException{ 
    try { 
     InputStream myInput = context.getAssets().open(DB_NAME); 

     File dbFile=new dbFile(DB_PATH); 
     dbFile.mkdirs(); 

     String outputFileName = DB_PATH + DB_NAME; 
     OutputStream myOutput = new FileOutputStream(outputFileName); 

     byte[] buffer = new byte[1024]; 
     int length; 

     while((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } catch (Exception e) { 
     Log.e("tle99 - copyDatabase", e.getMessage()); 
    } 
} 
+0

這就是我已經告訴過的。你複製我的答案。 – ppshein

+0

感謝您的回覆,但我認爲真正的形式應該是:文件dbFile = new File(DB_PATH);這是真的嗎?無論如何,這個技巧不能解決我的問題,logcat消息不會改變。 –

+0

一旦uninistall並重新安裝應用程序並檢查。有時會由於錯誤而創建空數據庫。 –

0

我有這有點兒遇到這樣。爲了解決這個問題,

  • 檢查「數據庫」文件夾存在與否第一。如果不存在,請先創建「數據庫」文件夾。
  • 如果「databases」文件夾存在,則調用「copyDataBase」函數。

有時候, 「數據庫」 文件夾中缺少早期Android版本。

+0

感謝您的關注,我創建了一個資產文件夾(右鍵單擊res,然後選擇新建,選擇文件夾,最後選擇資產文件夾),並將我的數據庫文件放在該文件夾中,這是錯的嗎?我應該把我的數據庫文件放在哪裏? –

+0

nope。您想將數據庫從您的資產文件夾複製到您的應用程序核心數據的數據庫文件夾中,對嗎?如果那樣的話,就像我提到的那樣編寫代碼。 – ppshein

+0

我在應用程序主文件夾中創建了一個數據庫文件夾,但沒有任何改變,你能告訴我什麼是你的意思關於「然後調用」copyDataBase「函數」 –