2012-09-12 141 views
0

我是非常新的創建和操作數據庫,我似乎被卡住了,我的logcat一直告訴我,它無法打開數據庫?SQLite數據庫無法打開

09-12 13:02:31.823:I/SqliteDatabaseCpp(7213):源碼返回:錯誤代碼= 14,味精=可以在線路27701不能打開文件的[8609a15dfa],DB = /數據/數據/ net.learn2develop.Database/databases/database

我猜它找不到它,但我很利用爲什麼。感謝你們中的很多人,在這裏我一直工作到目前爲止,但仍然陷入困境,我的代碼正在做的是導入我從assets文件夾中創建的數據庫。這裏是我的數據庫輔助類:

public class DatabaseHelper extends SQLiteOpenHelper { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_ALCOHOL = "alcohol"; 
public static final String KEY_TYPE = "type"; 
public static final String KEY_BRAND = "brand"; 
public static final String KEY_PRICE = "price"; 
private static final String TAG = "DatabaseHelper"; 

private static String DB_PATH = "/data/data/net.learn2develop.Database/databases/"; 

private static String DB_NAME = "database"; 
private static final String DB_TABLE = "booze"; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
*/ 
public DatabaseHelper(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 

} 

/** 
* Creates a empty database on the system and rewrites it with your own database. 
* */ 
public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 

     //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

} 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){ 

     //database does't exist yet. 

    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 

/** 
* Copies your database from your local assets-folder to the just created empty database in the 
* system folder, from where it can be accessed and handled. 
* This is done by transfering bytestream. 
* */ 
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(outFileName); 

    //transfer bytes from the inputfile to the 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_READONLY); 

} 

@Override 
public synchronized void close() { 

     if(myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase myDataBase) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase myDataBase, int oldVersion, int newVersion) { 
    Log.w(TAG, "Upgrading database from version " + oldVersion 
      + " to " 
      + newVersion + ", which will destroy all old data"); 
     myDataBase.execSQL("DROP TABLE IF EXISTS titles"); 
     onCreate(myDataBase); 

} 

//---insert a title into the database--- 
public long insertTitle(String alcohol, String type, String brand, int price) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_ALCOHOL, alcohol); 
    initialValues.put(KEY_TYPE, type); 
    initialValues.put(KEY_BRAND, brand); 
    initialValues.put(KEY_PRICE, price); 
    return myDataBase.insert(DB_TABLE, null, initialValues); 
} 

//---retrieves a particular title--- 
public Cursor getTitle(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      myDataBase.query(true, DB_TABLE, new String[] { 
        KEY_ROWID, 
        KEY_ALCOHOL, 
        KEY_TYPE, 
        KEY_BRAND, 
        KEY_PRICE 
        }, 
        KEY_ROWID + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

以下是我在一個測試活動我打電話,看看我是否可以讀取DB:

public class DatabaseActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_database); 
    DatabaseHelper myDbHelper = new DatabaseHelper(this); 

    //---get a title--- 
    myDbHelper.openDataBase(); 
    Cursor c = myDbHelper.getTitle(2); 
    if (c.moveToFirst())   
     DisplayTitle(c); 
    else 
     Toast.makeText(this, "No title found", 
       Toast.LENGTH_LONG).show(); 
    myDbHelper.close(); 
} 

public void DisplayTitle(Cursor c) 
{ 
    Toast.makeText(this, 
      "id: " + c.getString(0) + "\n" + 
      "ALCOHOL: " + c.getString(1) + "\n" + 
      "TYPE: " + c.getString(2) + "\n" + 
      "BRAND: " + c.getString(3) + "\n" + 
      "PRICE: " + c.getString(4), 
      Toast.LENGTH_LONG).show();   
} 

} 

我的數據庫中,我創建名稱爲只是「數據庫」,該活動是「DatabaseActivity.java」和輔助文件是「DatabaseHelper.java」

這裏是我的數據庫看起來像 enter image description here

+0

嘗試cahnge場DB_NAME =上DB_NAME =「數據庫「數據庫」。 sqlite「 –

回答

1

你應該總是張貼所有logcat的錯誤,但我想我看到的問題。

您已經在DatabaseHelper構造函數的幕後打開了SQLiteDatabase,現在您想要訪問它。試試這個:

public void openDataBase() throws SQLException{ 
    myDataBase = getWritableDatabase(); 
} 

你有沒有從資產文件夾複製你的數據庫?

DatabaseHelper myDbHelper = new DatabaseHelper(this); 

if(!myDbHelper.checkDataBase()) 
    myDbHelper.copyDataBase(); 
myDbHelper.openDataBase(); 

如果您還沒有這樣做,則數據庫不會在database/文件夾中,並不能打開...

+0

我把它放在裏面,現在試用了logcat告訴我09-12 13:51:46.320:I/SqliteDatabaseCpp(9821):sqlite返回:錯誤代碼= 1,msg = no這樣的表:booze,db = /data/data/net.learn2develop.Database/databases/database它現在能否在數據庫中找到表?我會張貼所有的logcat這次,但我不能在評論 – Hockeyman271

+0

那麼這意味着我解決了你問的問題。我不介意進一步幫助你,但我沒有看到你的表格模式。你的'公共無效的onCreate(SQLiteDatabase myDataBase){}'是空的...'CREATE TABLE ...''在哪裏? – Sam

+0

我在數據庫設置中添加了一個選擇到我的文章,然後掛在即時檢查onCreate真正快速 – Hockeyman271

0

這是品嚐DATABSE助手,我使用的,它的工作原理,

import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Set; 

import org.example.db.R; 
import org.example.model.contact; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class SQLiteHelper extends SQLiteOpenHelper { 

// Attributes 
private Context context; 
private SQLiteDatabase database; 

@SuppressWarnings("unused") 
private interface Table { 
    public static final String CONTACT = "contact"; 
/** 
* Constructor 
* @param context 
*/ 
public SQLiteHelper(Context context) { 
    this(context, context.getString(R.string.db_name), null, 33); 

    this.context = context; 
    database = getReadableDatabase(); 
} 

public SQLiteHelper(Context context, String name, CursorFactory factory, 
     int version) { 
    super(context, name, factory, version); 
} 


public Contact getContact(long contactId) { 
    String sql = "SELECT * FROM " + Table.CONTACT + 
     " WHERE " + Contact.Column.ID + " = " + contactId; 


    Contact contact = null; 
    Cursor cursor = database.rawQuery(sql, null); 
    if(cursor.moveToNext()) { 
     contact = getContactFromCursor(cursor); 
    } 
    cursor.close(); 

    return contact; 
} 

public List<contact> getContacts() { 
    String sql = "SELECT * FROM " + Table.CONTACT+ " ORDER BY " + 
     Contact.Column.NAME + " ASC"; 

    List<Contact> contacts = new ArrayList<Contact>(); 
    Cursor cursor = database.rawQuery(sql, null); 
    while(cursor.moveToNext()) { 
     Contact contact= getContactFromCursor(cursor); 
     if(contact!= null) { 
      contacts.add(baby); 
     } 
    } 
    cursor.close(); 

    return contacts; 
} 

private Baby getContactFromCursor(Cursor cursor) { 
    long id = cursor.getLong(cursor.getColumnIndex(Contact.Column.ID)); 
    String name = cursor.getString(cursor.getColumnIndex(Contact.Column.NAME)); 
    int gender = cursor.getInt(cursor.getColumnIndex(Contact.Column.GENDER)); 

    Contact contact= new Contact(id, name, gender); 

    return contact; 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 

} 

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

} 

public void close() { 
    if(database != null && database.isOpen()) { 
     database.close(); 
    } 
} 

public boolean isOpen() { 
    return database != null ? database.isOpen() : false; 
} 

}