Как передать переменную из деятельности в класс?

Все остальные подняли основы - что происходит в блоке, остается в блоке. Но в случае .NET может оказаться полезным изучить, что думает компилятор. Возьмем, к примеру, следующий код try / catch (обратите внимание, что StreamReader объявлен правильно за пределами блоков):

static void TryCatchFinally()
{
    StreamReader sr = null;
    try
    {
        sr = new StreamReader(path);
        Console.WriteLine(sr.ReadToEnd());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        if (sr != null)
        {
            sr.Close();
        }
    }
}

В MSIL будет скомпилировано что-то похожее на следующее:

.method private hidebysig static void  TryCatchFinallyDispose() cil managed
{
  // Code size       53 (0x35)    
  .maxstack  2    
  .locals init ([0] class [mscorlib]System.IO.StreamReader sr,    
           [1] class [mscorlib]System.Exception ex)    
  IL_0000:  ldnull    
  IL_0001:  stloc.0    
  .try    
  {    
    .try    
    {    
      IL_0002:  ldsfld     string UsingTest.Class1::path    
      IL_0007:  newobj     instance void [mscorlib]System.IO.StreamReader::.ctor(string)    
      IL_000c:  stloc.0    
      IL_000d:  ldloc.0    
      IL_000e:  callvirt   instance string [mscorlib]System.IO.TextReader::ReadToEnd()
      IL_0013:  call       void [mscorlib]System.Console::WriteLine(string)    
      IL_0018:  leave.s    IL_0028
    }  // end .try
    catch [mscorlib]System.Exception 
    {
      IL_001a:  stloc.1
      IL_001b:  ldloc.1    
      IL_001c:  callvirt   instance string [mscorlib]System.Exception::ToString()    
      IL_0021:  call       void [mscorlib]System.Console::WriteLine(string)    
      IL_0026:  leave.s    IL_0028    
    }  // end handler    
    IL_0028:  leave.s    IL_0034    
  }  // end .try    
  finally    
  {    
    IL_002a:  ldloc.0    
    IL_002b:  brfalse.s  IL_0033    
    IL_002d:  ldloc.0    
    IL_002e:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()    
    IL_0033:  endfinally    
  }  // end handler    
  IL_0034:  ret    
} // end of method Class1::TryCatchFinallyDispose

Что мы видим? MSIL уважает блоки - они являются неотъемлемой частью базового кода, сгенерированного при компиляции вашего C #. Объем не просто установлен в спецификации C #, но и в спецификации CLR и CLS.

Объем защищает вас, но вам иногда приходится обходить его. Со временем вы привыкаете к этому, и он начинает чувствовать себя естественным. Как и все остальные, что происходит в блоке, остается в этом блоке. Вы хотите поделиться чем-то? Вы должны выйти за пределы блоков ...

-4
задан Fantômas 18 January 2019 в 17:22
поделиться

2 ответа

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

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

ПРИМЕР

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

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

При нажатии на кнопку СОХРАНИТЬ ДАННЫЕ будет сохранен текст, который был передан с помощью намерения ( 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 (List Activity): -

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 (2nd Activity)

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
ответ дан MikeT 18 January 2019 в 17:22
поделиться

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

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();
}
0
ответ дан npeixoto 18 January 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: