[обновление: проверено нормальные коды] Я обновил код от копирования базы данных до чтения группы имен из таблицы базы данных.
Для доступа к внешней базе данных sqlite, хранящейся в папке активов, это работает для меня такпожалуйста, проверьте.
данные вставлены во внешнюю базу данных sqlite, но не сохранены в Android Studio
В вашем случае я рекомендую следующие изменения:
1) моя таблица в sqlite dbbrowser:
CREATE TABLE `Bonus_Data` (
`id` INTEGER NOT NULL,
`name` TEXT NOT NULL,
PRIMARY KEY(`id`)
);
2) в вашем классе AppDataDBHelper:
public class AppDataDBHelper extends SQLiteOpenHelper{
private static String TAG = "AppDataDBHelper"; // Tag just for the LogCat window
private static String DB_NAME = "appdata.db";// Database name
private static String DB_TABLE = "Bonus_Data";
private static int DB_VERSION = 1;
private SQLiteDatabase mDataBase;
private final Context mContext;
public AppDataDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDataBase() throws IOException {
//If the database does not exist, copy it from the assets.
Log.e(TAG, "Entered createDatabase");
boolean mDataBaseExist = checkDataBase();
if (!mDataBaseExist) {
this.getReadableDatabase();
this.close();
try {
//Copy the database from assets
Log.e(TAG, "createDatabase passing to copyDatabase");
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() {
Log.e(TAG, "entered checkDatabase");
File dbFile = new File(mContext.getDatabasePath(DB_NAME).getPath());
if (dbFile.exists()) return true;
File dbdir = dbFile.getParentFile();
if (!dbdir.exists()) {
dbdir.mkdirs();
}
return false;
}
//Copy the database from assets
private void copyDataBase() throws IOException {
InputStream mInput = null;
OutputStream mOutput = null;
Log.e(TAG, "entered copyDatabase");
Log.e(TAG, "copyDatabase close");
String outFileName = mContext.getDatabasePath(DB_NAME).getPath();
try {
mInput = mContext.getAssets().open(DB_NAME);
mOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = mInput.read(buffer)) > 0) {
mOutput.write(buffer, 0, length);
}
mOutput.flush();
mOutput.close();
mInput.close();
} catch (IOException ie) {
throw new Error("Copydatabase() error ");
}
}
public ArrayList<String> readNames() {
boolean distinct = true;
ArrayList<String> mname = new ArrayList<>();
String[] columns = new String[]{"name"};
//Cursor cursor = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
//This is used to draw distinct data values from database table
Cursor cursor = mDataBase.query(distinct, DB_TABLE, columns, null, null, null, null, null, null);
int iName = cursor.getColumnIndex("name");
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
mname.add(cursor.getString(iName));
}
cursor.close();
return mname;
}
//this openRead is needed everytime you access this helper class
public void openRead() {
mDataBase = getReadableDatabase(); //mDatabase should always be initialized or else app crashes while accessing TABLE
}
}
2) наконец, в методе onCreate () вашей деятельности создайте базу данных как:
public class TestActivity extends AppCompatActivity {
private static final String TAG = "TestActivity";
private ArrayList<String> name = new ArrayList<>();
private TextView textView_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
AppDataDBHelper appDBHelper = new AppDataDBHelper(this);
try {
Log.e(TAG, "Calling createDataBase");
appDBHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to CREATE DATABASE");
} finally {
appDBHelper.close();
}
textView_name = findViewById(R.id.textView_name);
check();
String message = "";
for (int i=0; i<name.size(); i++) {
message = message + name.get(i) + "\n";
}
textView_name.setText(message);
}
private void check() {
try {
AppDataDBHelper appDataDBHelper = new AppDataDBHelper(this);
appDataDBHelper.openRead(); //without this app crashes
name = appDataDBHelper.readNames();
appDataDBHelper.close();
} catch (Exception e) {
throw new Error("error reading");
}
}
}