【发布时间】:2018-06-15 00:10:04
【问题描述】:
我已经通过 sqlite 的数据库浏览器创建了一个数据库表,并将该文件添加到 Assets 文件夹中。 当我单击按钮时,我想从表中获取数据并在 TextView 中显示它们,但每次我运行时什么都没有出现,编译器说它们不是名为 Account 的表。我看过很多教程,每次出现同样的错误 这是代码。
帐户
public class Account {
private String UserName;
private String Email;
public Account() {
}
public Account(String userName, String email) {
UserName = userName;
Email = email;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
}
数据库助手
public class DbHelper extends SQLiteOpenHelper {
private static String DB_PATH="";
private static String DB_NAME="MyDB.db";
private SQLiteDatabase mDataBase;
private Context mContext;
public DbHelper(Context context) {
super(context, DB_NAME, null, 1);
if (Build.VERSION.SDK_INT >= 17){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
mContext = context;
}
@Override
public synchronized void close() {
if (mDataBase != null){
mDataBase.close();
}
super.close();
}
private boolean checkDataBase(){
SQLiteDatabase tempDB = null;
try {
String path = DB_PATH + DB_NAME;
tempDB = SQLiteDatabase.openDatabase(path,null, SQLiteDatabase.OPEN_READWRITE);
}
catch (Exception ex){
if (tempDB != null)
tempDB.close();
}
return tempDB != null ? true:false;
}
public void copyDataBase(){
try {
InputStream myInput = mContext.getAssets().open(DB_NAME);
String outputFileNme = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outputFileNme);
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 (IOException e) {
e.printStackTrace();
}
}
public void openDataBase(){
String path = DB_PATH + DB_NAME;
mDataBase = SQLiteDatabase.openDatabase(path,null,SQLiteDatabase.OPEN_READWRITE);
}
public void createDataBase(){
boolean isDBExist = checkDataBase();
if (isDBExist){
} else {
this.getReadableDatabase();
try {
copyDataBase();
}catch (Exception ex){
}
}
}
public List<Account> getAllUsers(){
List<Account> temp = new ArrayList<Account>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor c;
try {
c = db.rawQuery("SELECT * FROM Account",null);
if (c == null) return null;
c.moveToFirst();
do {
Account account = new Account(c.getString(c.getColumnIndex("UserName")),c.getString(c.getColumnIndex("Email")));
temp.add(account);
} while (c.moveToNext());
c.close();
} catch (Exception e){
}
db.close();
return temp;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
主活动
public class MainActivity extends AppCompatActivity {
List<Account> lstUser = new ArrayList<Account>();
DbHelper dbHelper;
Button btnGetData;
LinearLayout container;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnGetData = findViewById(R.id.btnGetData);
container = findViewById(R.id.container);
dbHelper = new DbHelper(getApplicationContext());
dbHelper.createDataBase();
btnGetData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
lstUser = dbHelper.getAllUsers();
for (Account account:lstUser){
LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View addView = inflater.inflate(R.layout.row,null);
TextView txtUser = addView.findViewById(R.id.txtUser);
TextView txtEmail = addView.findViewById(R.id.txtEmail);
txtUser.setText(account.getUserName());
txtEmail.setText(account.getEmail());
container.addView(addView);
}
}
});
}
}
【问题讨论】:
-
我建议返回 DB Browser for SQLite,然后检查 Account 表是否已定义,然后单击 File/Write Changes,然后重新复制文件(必须是 MyDB.db)到 assets 文件夹(如果有的话,不是子目录),然后删除应用程序的数据并重新运行。
-
@MikeT 我已经卸载了应用程序并多次检查了表格并发生了同样的错误
-
如果您已经完成了上述所有操作(如果您这样做了),那么设备是什么版本?如果是 P,也许可以尝试早期版本(我已经在 API 16 和 API 26 上运行代码 OK,没有 27 设备(有一些在 27 上遇到困难)。
标签: android database sqlite android-sqlite