Разделитель пути Escape в регулярном выражении

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();
                }
            }
        });
    }
}
11
задан Guido 28 October 2008 в 10:28
поделиться

5 ответов

Делает Pattern.quote(File.separator) добиться цели?

Править: Это доступно с Java 1.5 или позже. Для 1,4, необходимо просто выйти из символа разделителя файлов:

"\\" + File.separator

Выход из знаков пунктуации ничего не повредит, но выходящие буквы или числа безусловно или изменят их на свое особое значение или приведут к PatternSyntaxException. (Спасибо Alan M для указания на это в комментариях!)

13
ответ дан 3 December 2019 в 05:14
поделиться

Там какой-либо путь состоит в том, чтобы использовать общее регулярное выражение, которое работает и в Windows и в системах UNIX?

Да, просто используйте regex, который соответствует обоим видам разделителя.

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js$" );

Это безопасно, потому что ни Windows, ни Unix не разрешают те символы на имя файла или каталога.

6
ответ дан 3 December 2019 в 05:14
поделиться

Почему Вы не выходите File.separator:

... +
"\\" + File.separator +
...

соответствовать Pattern.compile требования? Я надеюсь "/" (случай Unix) обрабатывается как сингл "/".

1
ответ дан 3 December 2019 в 05:14
поделиться

Не можете Вы просто использовать обратную косую черту для выхода из разделителя пути как так:

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js$" );
2
ответ дан 3 December 2019 в 05:14
поделиться

Я протестировал ответ gimel в системе Unix - помещение "\\" + File.separator хорошо работает - получающееся "\/" в шаблоне правильно соответствует синглу "/"

0
ответ дан 3 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

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