Android SQL Пользовательские базы данных - PullRequest
0 голосов
/ 15 января 2019

(плохо знаком с 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);

1 Ответ

0 голосов
/ 15 января 2019

Использование

String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
        KEY_Name +" TEXT, "+KEY_Gender+" TEXT)";

Будет работать один раз при первом запуске приложения.Затем у вас будет ошибка, потому что приложение попытается создать таблицу, которая уже существует.

Изменение на

String createTable = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
        KEY_Name +" TEXT, "+KEY_Gender+" TEXT)";

Обойдет этот сбой.Скорее всего, это проблема, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...