Все остальные подняли основы - что происходит в блоке, остается в блоке. Но в случае .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.
Объем защищает вас, но вам иногда приходится обходить его. Со временем вы привыкаете к этому, и он начинает чувствовать себя естественным. Как и все остальные, что происходит в блоке, остается в этом блоке. Вы хотите поделиться чем-то? Вы должны выйти за пределы блоков ...
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: <<<<<
Код выглядит следующим образом
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);
}
}
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();
}
}
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();
}
}
});
}
}
Вы можете просто создать экземпляр класса своей базы данных в своей деятельности
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();
}