0

我有一个非常奇怪的问题,我正在编写一个从数据库获取数据以在 listView 中显示它的代码,所以我创建了一个用于获取数据库的类和另一个用于适配器的类。但是当我在设备上运行它时,我没有得到这样的表错误,尽管它在模拟器上运行良好。此外,我在同一个项目中使用另一个数据库尝试了这段代码,它正在工作。我向它们添加了 android_metadata 表,但仍然无法正常工作。

这是我的db class

public class Directory_DB extends SQLiteOpenHelper{

private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
//destination path (location) of our database on device
private static String DB_PATH = ""; 
private static String DB_NAME ;// Database name
private SQLiteDatabase mDataBase; 
private final Context mContext;
private String TABLE_NAME;

public Directory_DB(Context context , String DB_NAME ) 
{
    super(context , DB_NAME, null , 2);// 1? its Database Version
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.mContext = context;
    this.DB_NAME = DB_NAME;

}   

public void createDataBase() throws IOException
{
    //If database not exists copy it from the assets

    boolean mDataBaseExist = checkDataBase();
    if(!mDataBaseExist)
    {
        this.getReadableDatabase();
        this.close();
        try 
        {
            //Copy the database from assests
            copyDataBase();
            Log.e(TAG, "createDatabase database created");
        } 
        catch (IOException mIOException) 
        {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}
    //Check that the database exists here: /data/data/your package/databases/Da Name
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }

    //Copy the database from assets
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    //Open the database, so we can query it
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close() 
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }




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

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

}

这是我的adapter class

public class DirectoryAdapter {
public static final String TAG_ID = "_id";
public static String TAG_TABLE_NAME;

protected static final String TAG = "DataAdapter";

private final Context mContext;
private SQLiteDatabase mDb;
private Directory_DB mDbHelper;

public DirectoryAdapter(Context context, String DB_NAME, String TABLE_NAME) {
    this.mContext = context;
    mDbHelper = new Directory_DB(mContext, DB_NAME );
    this.TAG_TABLE_NAME = TABLE_NAME;
    Log.d("Database name in adapter", DB_NAME);
    Log.d("Table name in adapter", TAG_TABLE_NAME);
}

public DirectoryAdapter createDatabase() throws SQLException {
    try {
        mDbHelper.createDataBase();
    } catch (IOException mIOException) {
        Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
        throw new Error("UnableToCreateDatabase");
    }
    return this;
}

public DirectoryAdapter open() throws SQLException {
    try {
        mDbHelper.openDataBase();
        mDbHelper.close();
        mDb = mDbHelper.getReadableDatabase();
    } catch (SQLException mSQLException) {
        Log.e(TAG, "open >>" + mSQLException.toString());
        throw mSQLException;
    }
    return this;
}

public void close() {
    mDbHelper.close();
}

public Cursor getTestData() {
    try {

        String sql = "SELECT * FROM " + TAG_TABLE_NAME;
        Cursor mCur = mDb.rawQuery(sql, null);

        return mCur;
    } catch (SQLException mSQLException) {
        Log.e(TAG, "getTestData >>" + mSQLException.toString());
        throw mSQLException;
    }
}

}

4

2 回答 2

2

您可以从设备上卸载应用程序并再次运行它。如果您稍后在数据库中添加了一个表,它将不会反映,因为您的数据库已经创建并且只有在创建数据库时才会创建表。

于 2012-12-19T09:51:06.693 回答
0

您必须在 on create 方法中调用您的 createDataBase 方法

 @Override
 public void onCreate(SQLiteDatabase db) {
     // TODO Auto-generated method stub
 }

这就是这个方法的用途。此外,如果您在其他任何地方调用它(我没有阅读您的整个代码),请不要这样做。

于 2012-12-19T10:15:26.060 回答