我是Android的初学者。我正在通过SQLite创建数据库。我创建了阿拉伯语数据库文件,并将其放入名为sample.db
的资产文件夹中。现在我试图从资产文件夹中读取数据库,但我收到一个错误,应用程序崩溃。最好的方法是什么?任何帮助都将不胜感激。
这是www.example.com中的代码DbHelper.java
package ...
import ...
public class DbHelper extends SQLiteOpenHelper {
String dbName;
Context context;
String dbPath;
String tableName = "Dictionary";
String ArabicCol = "Arabic";
public DbHelper(MainActivity mcontext, String name, int version) {
super(mcontext, name, null, version);
this.context = mcontext;
this.dbName = name;
this.dbPath = "/data/data" + "com.example.e_qtishaddictionary3" + "databases";
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion)
CopyDatabase();
}
public void CheckDb(){
SQLiteDatabase CheckDb = null;
try {
String filePath = dbPath + dbName;
CheckDb = SQLiteDatabase.openDatabase(filePath, null, 0);
}catch (Exception e) {
}
if (CheckDb != null) {
Log.d("CheckDb", "Database already exists");
CheckDb.close();
} else {
CopyDatabase();
}
}
public void CopyDatabase() {
this.getReadableDatabase();
try{
InputStream is = context.getAssets().open(dbName);
OutputStream os = new FileOutputStream(dbPath + dbName);
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))>0){
os.write(buffer,0,len);
}
os.flush();
is.close();
os.close();
}catch (Exception e) {e.printStackTrace();}
Log.d("CopyDb", "Database Copied");
}
public void OpenDatabase(){
String filepath = dbPath + dbName;
SQLiteDatabase.openDatabase(filepath,null,0);
}
public ArrayList<String> getArabicWord(String query){
ArrayList<String> arabicList = new ArrayList<>();
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
Cursor cursor;
cursor = sqLiteDatabase.query(
tableName,
new String[]{ArabicCol},
ArabicCol + " LIKE ? ",
new String[]{query + "%"},
null, null,
ArabicCol
);
int index = cursor.getColumnIndex(ArabicCol);
while (cursor.moveToNext()){
arabicList.add(cursor.getString(index));
}
sqLiteDatabase.close();
cursor.close();
return arabicList;
}
}
MainActivity.java
package ...
import ...
public class MainActivity extends AppCompatActivity {
AutoCompleteTextView autoCompleteTextView;
DbHelper dbHelper;
ArrayList<String> newList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
autoCompleteTextView = findViewById(R.id.autotxt);
dbHelper = new DbHelper(this,"sample.db",1);
try{
dbHelper.CheckDb();
dbHelper.OpenDatabase();
}catch(Exception e) {
e.printStackTrace();
}
newList = new ArrayList<>();
autoCompleteTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
if(s.length() > 0 ){
newList.addAll(dbHelper.getArabicWord(s.toString()));
autoCompleteTextView.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, newList));
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
这是我的logcat的一部分
(1) no such table: Dictionary in "SELECT Arabic FROM Dictionary WHERE Arabic LIKE ? ORDER BY Arabic"
2023-04-20 03:27:40.261 17406-17406 AndroidRuntime com.example.e_qtishaddictionary3 D Shutting down VM
2023-04-20 03:27:40.264 17406-17406 AndroidRuntime com.example.e_qtishaddictionary3 E FATAL EXCEPTION: main
Process: com.example.e_qtishaddictionary3, PID: 17406
android.database.sqlite.SQLiteException: no such table: Dictionary (code 1 SQLITE_ERROR[1]): , while compiling: SELECT Arabic FROM Dictionary WHERE Arabic LIKE ? ORDER BY Arabic
at
以及相关线路
at com.example.e_qtishaddictionary3.DbHelper.getArabicWord(DbHelper.java:84)
at com.example.e_qtishaddictionary3.MainActivity$1.onTextChanged(MainActivity.java:44)
我已经看了我的代码2天了,但是我不知道我哪里错了。你能帮我吗?谢谢。
1条答案
按热度按时间68bkxrlz1#
首先,您需要修复数据库的URL
像下面一样
其次,您忘记添加命令来首先创建表本身Dictionary,因此您需要在**void onCreate(SQLiteDatabase sqliteDatabase)**上添加下面的表创建sql命令