Как передать переменную из деятельности в класс? - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение, которое пользователи могут хранить данные в деятельности под названием LIST.Когда приложение запускается, пользователь должен написать имя списка.Чем показывается действие с помощью EditText, где пользователь может хранить некоторые данные.

Проблема, с которой я столкнулся, заключается в следующем: я хотел бы создать разные таблицы в своей базе данных.Один для каждого из этих списков.Поэтому каждый раз, когда пользователь запускает новые списки, он должен создавать новую таблицу.И имя таблиц будет определяться пользователем.У каждого списка будет своя таблица, а именем таблицы будет имя списка.

Я пытаюсь получить строку списка имен с помощью Intent и восстанавливать ее в моем классе OpenHelper, но это не так.за работой.Честно говоря, я не знаю, правильно ли это, поэтому я ищу вашу помощь.

Как я могу получить строку и использовать ее в качестве имен таблиц?

Заранее спасибо!

Вот мой код:

Здесь я получаю строку, название таблицы.Это работает!

Intent intent2 = new Intent(ColetaListaActivity.this, OpenHelper.class);
                        intent2.putExtra("nomelista", nomeLista);
                        startActivity(intent2);

Вот мой OpenHelper:

На самом деле говорят, что нужен метод для getIntent.И я не знаю, что делать.

public class OpenHelper extends SQLiteOpenHelper {

    private static final String NOME_BANCO = "codigoslista.db";
    private static final int VERSAO_BANCO = 1;
    public String nomelistafinal;

    public OpenHelper(Context ctx) {
        super(ctx, NOME_BANCO, null, VERSAO_BANCO);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        //pega nome da lista
        Bundle bundle = getIntent().getExtras();
        nomelistafinal = bundle.getString("nomelista");

        //db.execSQL("CREATE TABLE CODIGOS(codigo text not null) ");
        db.execSQL("CREATE TABLE " + nomelistafinal + "(codigo text not null) ");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //db.execSQL("DROP TABLE CODIGOS");
        db.execSQL("DROP TABLE " + nomelistafinal);

        onCreate(db);

    }

}

Заранее спасибо!

Ответы [ 2 ]

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

OpenHelper не является Activity, поэтому вы не можете запустить его, как если бы это было Activity. Поскольку это не Activity или унаследовано от Activity, у него нет метода getIntent .

Вам нужно другое действие, скажем, StoreData тогда - начать эту деятельность, - получить дополнительные намерения в методе onCreaate этого занятия = создать экземпляр объекта OpenHelper снова или через метод onCreate - вы можете получить доступ к таблицам в базе данных через - например, сохранить данные, введенные в этой деятельности - вам также нужно было бы отменить попытку получить дополнительные функции Intent.

Пример

Ниже приведен простой пример передачи строки (значение mydata ) из действия List в действие StoreData .

Операция StoreData , которая позволяет пользователю ввести некоторые данные в текст редактирования и затем нажать кнопку СОХРАНИТЬ ДАННЫЕ.

При нажатии кнопки SAVE DATA будет сохранен текст, который был передан с помощью намерения ( mydata ), с данными, введенными пользователем (если щелкнуть мышью, когда ничего не было введено, строка будет не будет добавлено и тост будет указывать это). Если строка успешно добавлена, тост подтверждает это.

Это еще одна кнопка LOG DATA (если есть) , если по ней щелкнуть, и есть какие-либо строки, которые были сохранены, данные будут записаны в Журнал с использованием DataBaseUtils dumpCursor метод.

например. : 0-

2019-01-19 16:56:26.166 7477-7477/mjt.test001 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@8f5d8ba
2019-01-19 16:56:26.167 7477-7477/mjt.test001 I/System.out: 0 {
2019-01-19 16:56:26.167 7477-7477/mjt.test001 I/System.out:    codigo=mydataTEST
2019-01-19 16:56:26.167 7477-7477/mjt.test001 I/System.out: }
2019-01-19 16:56:26.167 7477-7477/mjt.test001 I/System.out: <<<<<
  • Это указывает на то, что столбец codigo для единственной строки в таблице содержит значение mydataTEST (т. Е. Mydata была передана через Intent, TEST был введен пользователем).

Код выглядит следующим образом

List.java (Список активности): -

public class List extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent i = new Intent(this,StoreData.class);
        i.putExtra("nomelista","mydata");
        // NOTE starts the 2nd activity straight away
        startActivity(i);
    }
}

OpenHelper.java (см. Комментарии): -

public class OpenHelper extends SQLiteOpenHelper {

    private static final String NOME_BANCO = "codigoslista.db";
    private static final int VERSAO_BANCO = 1;
    public static String nomelistafinal = "the_table_name"; //<<<<<<<<<< CHANGED

    public OpenHelper(Context ctx) {
        super(ctx, NOME_BANCO, null, VERSAO_BANCO);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        //pega nome da lista
        //Bundle bundle = getIntent().getExtras(); //<<<<<<<<< COMMENTD OUT
        //nomelistafinal = bundle.getString("nomelista"); //<<<<<<<<< COMMENTED OUT

        //db.execSQL("CREATE TABLE CODIGOS(codigo text not null) ");
        db.execSQL("CREATE TABLE " + nomelistafinal + "(codigo text not null) ");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //db.execSQL("DROP TABLE CODIGOS");
        db.execSQL("DROP TABLE " + nomelistafinal);
        onCreate(db);
    }

    /**
     * Store some data
     * @param codigo
     * @return the rowid of the inserted row
     */
    public long storeData(String codigo) {
        ContentValues cv = new ContentValues();
        cv.put("codigo",codigo);
        SQLiteDatabase db = this.getWritableDatabase();
        return db.insert(nomelistafinal,null,cv);
    }

    /**
     * Dump all data from the nomlistafinal table
     */
    public void logData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(nomelistafinal,null,null,null,null,null,null);
        DatabaseUtils.dumpCursor(csr);
        csr.close();
    }
}

StoreData (2-е задание)

public class StoreData extends AppCompatActivity {

    EditText mMyData;
    Button mSave, mLogData;
    OpenHelper mOpnHlpr;
    String mCurrentNomlist;
    long mLastIDAdded;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_store_data);
        mMyData = this.findViewById(R.id.mydata);
        mSave = this.findViewById(R.id.save);
        mOpnHlpr = new OpenHelper(this);
        mCurrentNomlist = getIntent().getStringExtra("nomelista");
        setupUI();
    }

    private void setupUI() {
        mMyData = this.findViewById(R.id.mydata);
        mSave = this.findViewById(R.id.save);

        // Add the OnClick Listener
        mSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Do nothing if there is no data
                if (mMyData.getText().toString().length() < 1) {
                    Toast.makeText(StoreData.this, "Not Added as there is nothing to add.", Toast.LENGTH_SHORT).show();
                    return;
                }
                // Otherwise addd a row
                if ((mLastIDAdded = mOpnHlpr.storeData(mCurrentNomlist + mMyData.getText().toString())) > 0) {
                    Toast.makeText(StoreData.this,"Added row with an ID of " + String.valueOf(mLastIDAdded),Toast.LENGTH_SHORT).show();
                }
            }
        });

        mLogData = this.findViewById(R.id.logdata);
        mLogData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (DatabaseUtils.queryNumEntries(mOpnHlpr.getWritableDatabase(),OpenHelper.nomelistafinal) > 0) {
                    mOpnHlpr.logData();
                }
            }
        });
    }
}
0 голосов
/ 18 января 2019

Вы можете просто создать экземпляр класса своей базы данных в своей деятельности

OpenHelper mOpenHelper = new OpenHelper(this);

И создать метод в своем классе БД для создания ваших таблиц

public void createTable(String nomelistafinal ) {
    final SQLiteDatabase db = getWritableDatabase();
    db.execSQL("CREATE TABLE " + nomelistafinal + " (codigo text not null) ");
    db.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...