如何将变量从活动传递给类?

时间:2019-01-18 17:18:43

标签: android sqlite

我有一个应用程序,用户可以在名为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 :(得分:0)

您只需在活动中实例化数据库类

OpenHelper mOpenHelper = new OpenHelper(this);

并在db类中创建一个方法来创建表

public void createTable(String nomelistafinal ) {
    final SQLiteDatabase db = getWritableDatabase();
    db.execSQL("CREATE TABLE " + nomelistafinal + " (codigo text not null) ");
    db.close();
}

答案 1 :(得分:0)

OpenHelper不是活动,因此您无法像将其作为活动一样启动它。由于它不是Activity或从Activity继承,因此它没有 getIntent 方法。

您需要执行另一个活动,然后说StoreData -开始该活动, -在该活动的 onCreaate 方法中获取意图附加项 =再次通过 onCreate 方法实例化OpenHelper对象 -然后,您可以通过该数据库访问数据库中的表   -例如将输入的数据存储在该活动中 -您还需要删除获取Intent附加内容的尝试。

示例

下面是一个简单的示例,该示例将 List 活动中的字符串(值为 mydata )传递给 StoreData 活动。 / p>

StoreData 活动,该活动允许用户在编辑文本中输入一些数据,然后单击“保存数据”按钮。

单击保存数据按钮将存储通过意图( mydata )传递的文本与用户输入的数据(如果单击而未输入任何内容,则为行将不会添加,并且Toast将对此进行指示)。如果成功添加了该行,则Toast会对此进行确认。

这是另一个按钮 LOG DATA(如果有),如果单击此按钮并且已保存任何行,则将使用DataBaseUtils dumpCursor < / strong>方法。

例如: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(第二个活动)

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();
                }
            }
        });
    }
}