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();
}
}
});
}
}
Делает Pattern.quote(File.separator)
добиться цели?
Править: Это доступно с Java 1.5 или позже. Для 1,4, необходимо просто выйти из символа разделителя файлов:
"\\" + File.separator
Выход из знаков пунктуации ничего не повредит, но выходящие буквы или числа безусловно или изменят их на свое особое значение или приведут к PatternSyntaxException. (Спасибо Alan M для указания на это в комментариях!)
Там какой-либо путь состоит в том, чтобы использовать общее регулярное выражение, которое работает и в Windows и в системах UNIX?
Да, просто используйте regex, который соответствует обоим видам разделителя.
pattern = Pattern.compile(
"^(.+?)" +
"[/\\\\]" +
"js" +
"[/\\\\]" +
"(.+?)\\.js$" );
Это безопасно, потому что ни Windows, ни Unix не разрешают те символы на имя файла или каталога.
Почему Вы не выходите File.separator
:
... +
"\\" + File.separator +
...
соответствовать Pattern.compile
требования? Я надеюсь "/" (случай Unix) обрабатывается как сингл "/".
Не можете Вы просто использовать обратную косую черту для выхода из разделителя пути как так:
pattern = Pattern.compile(
"^(.+?)\\" +
File.separator +
"js\\" +
File.separator +
"(.+?).js$" );
Я протестировал ответ gimel в системе Unix - помещение "\\" + File.separator
хорошо работает - получающееся "\/"
в шаблоне правильно соответствует синглу "/"