(плохо знаком с SQL / java) Я пытаюсь реализовать приложение, которое будет принимать вход пользователя и сохранять данные в локальной базе данных SQL.
Все реализации, которые мне пока кажутся, определяют имя базы данных как
private static final String внутри вспомогательного класса базы данных. Мне нужно иметь возможность передать строку с именем пользователя из MainActivity в вспомогательный класс Database и создать / открыть базу данных с этим именем строки.
Когда я пытаюсь включить нефинальную строку как DATABASE_NAME в следующее объявление, она не запускается:
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(){
super(context,DATABASE_NAME,null,1);
}
Я не уверен, возможно ли это вообще. Если это невозможно, я буду признателен за любые предложения по хранению данных, разделенных разными пользователями, в одном приложении.
Спасибо всем!
Предоставление дополнительной информации в соответствии с просьбой. (код несколько запутан из нескольких экспериментов ....)
Это то, что у меня есть в классе Хелпер:
//DATABASE NAME
SQLiteDatabase data;
//TABLE_NAME
private String TABLE_NAME;
//COLUMN ID's
private static final String KEY_ID = "ID";
private static final String KEY_Name = "name";
private static final String KEY_Gender = "gender";
public DatabaseHelper(Context context, String DATABASE_NAME) { //tried to pass DATABASE name here
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) { //Could not pass TABLE_NAME here so created the "createTable" below
}
public void createTable(String TABLE_NAME){
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_Name +" TEXT, "+KEY_Gender+" TEXT)";
data.execSQL(createTable); //Code runs up to here on DEBUG
}
В MainActivity у меня есть это:
public class MainActivity extends AppCompatActivity {
DatabaseHelper mDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDatabaseHelper = new DatabaseHelper(this, "USER1");
mDatabaseHelper.createTable("People");
}
}
Журнал событий не показывает ошибок, но макет не отображается на эмуляторе. Если я не выполню последнюю команду:
mDatabaseHelper.createTable("People");
тогда макет входит идеально. Если я отлаживаю и перехожу построчно, программа переходит в try / catch внутри ActivityThread.java:
if (activity != null) {
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
Configuration config = new Configuration(mCompatConfiguration);
if (r.overrideConfig != null) {
config.updateFrom(r.overrideConfig);
}
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
+ r.activityInfo.name + " with config " + config);
Window window = null;
if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
window = r.mPendingRemoveWindow;
r.mPendingRemoveWindow = null;
r.mPendingRemoveWindowManager = null;
}
appContext.setOuterContext(activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback);
if (customIntent != null) {
activity.mIntent = customIntent;
}
r.lastNonConfigurationInstances = null;
checkAndBlockForNetworkAccess();
activity.mStartedActivity = false;
int theme = r.activityInfo.getThemeResource();
if (theme != 0) {
activity.setTheme(theme);
}
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
if (!activity.mCalled) {
throw new SuperNotCalledException(
"Activity " + r.intent.getComponent().toShortString() +
" did not call through to super.onCreate()");
}
r.activity = activity;
}
r.setState(ON_CREATE);
mActivities.put(r.token, r);
} catch (SuperNotCalledException e) {
throw e;
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to start activity " + component
+ ": " + e.toString(), e);
}
Это происходит, когда я выполняю следующую строку кода:
data.execSQL(createTable);