Android-Can';在预制数据库中找不到表
我正在尝试制作一个程序,该程序将采用我已经制作的SQLite数据库(称为os.SQLite),并能够读/写该数据库。我遵循来自的代码,Eclipse在复制数据库的过程中似乎没有给我任何错误,但当我尝试运行我的应用程序并显示表“OregonState”时,LogCat(我正在使用Eclipse Juno和ADT插件,并在SDK模拟器上运行我的应用程序)一直告诉我没有名为“OregonState”的表这是数据库中的一个表,我知道我创建了该表并将其放入项目中的资产文件夹中(我甚至可以看到该文件)。在多次失败的尝试之后,我注意到LogCat也说它无法打开数据库,因为数据库被锁定了。有人指出,我可能会正确地打开和关闭,但添加了这些,我的应用程序就会崩溃。有人能帮忙吗 我创建了一个适配器(它还包含一个复制数据库的SQLiteHelper嵌套类)来访问数据库,并允许我在表中插入/删除/等等。然后,我的主要活动使用此适配器。以下是我的代码(我已经包括了所有代码,不包括导入和包名),以确保完整:Android-Can';在预制数据库中找不到表,android,sqlite,sqliteopenhelper,Android,Sqlite,Sqliteopenhelper,我正在尝试制作一个程序,该程序将采用我已经制作的SQLite数据库(称为os.SQLite),并能够读/写该数据库。我遵循来自的代码,Eclipse在复制数据库的过程中似乎没有给我任何错误,但当我尝试运行我的应用程序并显示表“OregonState”时,LogCat(我正在使用Eclipse Juno和ADT插件,并在SDK模拟器上运行我的应用程序)一直告诉我没有名为“OregonState”的表这是数据库中的一个表,我知道我创建了该表并将其放入项目中的资产文件夹中(我甚至可以看到该文件)。在多
我注意到有一个类似的问题,虽然我的从来没有实际工作,而他的。我稍微遵循了他的代码,这只会让我的应用程序开始崩溃。我只想发表评论,但我是新来的,所以没有足够的声誉。我按照亚库布·艾哈迈德和维奥拉给我的指示行事!成功了!我以前有一个适配器类和一个SQLiteOpenHelper的迭代,但我认为可能是由于帮助器是嵌套类而使事情变得更加困难。事实上,我不确定我做错了什么,但我在Ahmad's得到的代码似乎工作得很好,因为我的表格可以在应用程序中打印出来。谢谢你,亚库布·艾哈迈德。我已经为其他有我问题的人提供了代码的链接。我认为问题可能是您硬编码了数据库路径。你应该通过以下途径获得它。其次,您预先制作的数据库文件可能缺少open helper组件所需的元数据内容。我知道,在我尝试将其复制到应用程序之前,我已经创建了“android_元数据”表,但我开始通过该方法获取数据库路径,我从其他人那里了解到,他们在SQLiteOpenHelper和预制数据库文件方面也存在问题,即使他们添加了元数据表。在我的书中,这太不稳定了,我不会用它。谁知道他们引入了或已经引入了什么样的细微更改,以使open helper不再接受预制文件。我会直接使用SQLiteDatabase类,因为它不需要元数据,而且您可以毫无问题地加载预制的数据库文件?只需使用openDatabase()?请遵循以下步骤:
public class SQLAdapter
{
private static final String TABLE_OSU = "OregonState";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_NAME = "Name";
private static final String COLUMN_FIELD = "Field";
private static final String DATABASE_PATH = "/data/data/com.example.sql2/databases/";
private static final String DATABASE_NAME = "os.sqlite";
private static final int DATABASE_VERSION = 1;
MySQLiteHelper helper;
private final Context context;
public SQLAdapter(Context context)
{
this.context = context;
helper = new MySQLiteHelper(context);
}
private class MySQLiteHelper extends SQLiteOpenHelper
{
private final Context context;
public MySQLiteHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase database)
{
try {
createDatabase();
} catch (IOException e) {
e.printStackTrace();
}
}
public void createDatabase() throws IOException
{
boolean dbExist = checkDatabase();
if (dbExist)
{
// Nothing
}
else
{
copyDatabase();
}
}
public boolean checkDatabase()
{
SQLiteDatabase checkDB = null;
try
{
String path = DATABASE_PATH + DATABASE_NAME;
checkDB = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {}
if (checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
}
public void copyDatabase() throws IOException
{
InputStream input = context.getAssets().open(DATABASE_NAME);
String outFileName = DATABASE_PATH + DATABASE_NAME;
OutputStream output = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer))>0)
output.write(buffer, 0, length);
output.flush();
output.close();
input.close();
}
public void openDatabase()
{
String path = DATABASE_PATH + DATABASE_NAME;
SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
SQLiteDatabase database = this.getWritableDatabase();
Log.w(DATABASE_NAME, "Upgrading database from " + oldVersion + " to " + newVersion + ", which will erase all data.");
database.execSQL("DROP TABLE IF EXISTS " + TABLE_OSU);
onCreate(database);
database.close();
}
}
public SQLiteDatabase open() throws SQLException
{
SQLiteDatabase database = helper.getWritableDatabase();
return database;
}
public void close()
{
helper.close();
}
public long insert(SQLiteDatabase database, String name, String field)
{
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
values.put(COLUMN_FIELD, field);
long x = database.insert(TABLE_OSU, null, values);
database.close();
return x;
}
public int delete(SQLiteDatabase database, int id)
{
int x = database.delete(TABLE_OSU, COLUMN_ID + "=" + id, null);
return x;
}
public Cursor getAll(SQLiteDatabase database)
{
return database.query(TABLE_OSU, new String[] {COLUMN_ID, COLUMN_NAME, COLUMN_FIELD}, null, null, null, null, null);
}
public Cursor get(SQLiteDatabase database, int id) throws SQLException
{
return database.query(TABLE_OSU, new String[] {COLUMN_ID, COLUMN_NAME, COLUMN_FIELD}, COLUMN_ID + "=" + id, null, null, null, null);
}
public int update(SQLiteDatabase database, int id, String name, String field)
{
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
values.put(COLUMN_FIELD, field);
return database.update(TABLE_OSU, values, COLUMN_ID + "=" + id, null);
}
}
public class SQLTest extends Activity
{
SQLAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
adapter = new SQLAdapter(this);
getAll();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_sqltest, menu);
return true;
}
public long insert(String name, String field)
{
SQLiteDatabase database = adapter.open();
long id = adapter.insert(database, name, field);
adapter.close();
return id;
}
public int delete(int id)
{
SQLiteDatabase database = adapter.open();
int rowsDeleted = adapter.delete(database, id);
adapter.close();
return rowsDeleted;
}
public void getAll()
{
SQLiteDatabase database = adapter.open();
TextView tv = new TextView(this);
String table = "";
try
{
Cursor cursor = adapter.getAll(database);
if (cursor.moveToFirst())
{
do
{
table += "\n" + cursor.getString(0) + " " + cursor.getString(1) + " " + cursor.getString(2);
} while (cursor.moveToNext());
}
cursor.close();
} catch (Exception e) {}
tv.setText(table);
setContentView(tv);
adapter.close();
}
public void get(int id)
{
SQLiteDatabase database = adapter.open();
Cursor cursor = adapter.get(database, id);
TextView tv = new TextView(this);
String table = "";
if (cursor.moveToFirst())
table += "\n" + cursor.getString(0) + " " + cursor.getString(1) + " " + cursor.getString(2);
else
table += "No hall found with ID: " + id;
tv.setText(table);
setContentView(tv);
cursor.close();
adapter.close();
}
public int update(int id, String name, String field)
{
SQLiteDatabase database = adapter.open();
int rowsUpdated = adapter.update(database, id, name, field);
adapter.close();
return rowsUpdated;
}
}