открытый ресурс с относительным путем в Java

I've modified your code a little bit:

public ArrayList<String> getAllContacts() {
    ArrayList<String> array_list = new ArrayList<>();

    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM "+CONTACTS_TABLE_NAME;
    Cursor res =  db.rawQuery( selectQuery, null );

    //check if data exist, proceed
    if (res.moveToNext()){
        do{
            array_list.add(res.getString(res.getColumnIndex(CONTACTS_COLUMN_NAME)));
        }while(res.moveToNext());
    }

    //remember to close cursor after use
    res.close();

    return array_list;
}


//void instead of boolean
public void insertContact (String name, String surname, String phone, String address,String postal) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(CONTACTS_COLUMN_NAME, name);
    contentValues.put(CONTACTS_COLUMN_SURNAME, surname);
    contentValues.put(CONTACTS_COLUMN_PHONE, phone);
    contentValues.put(CONTACTS_COLUMN_ADDRESS, address);
    contentValues.put(CONTACTS_COLUMN_POSTAL, postal);

    //throw if not inserted
    db.insertOrThrow("contacts", "", contentValues);
}

затем вы вставляете в свой стол вот так:

try {
    mydb.insertContact("one", "two", "three", "foir", "five");
}catch(Exception e){
    Toast.makeText(context, "Insert Failed: " + e.toString(), Toast.LENGTH_SHORT).show();
    }
76
задан mskfisher 5 April 2018 в 01:12
поделиться

6 ответов

Предоставьте путь относительно classloader, не класс, от которого Вы получаете загрузчик. Например:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
43
ответ дан jonathan.cone 24 November 2019 в 11:06
поделиться

При использовании 'getResource' на Классе относительный путь разрешен на основе пакета, в котором находится Класс. При использовании 'getResource' на ClassLoder относительный путь разрешен на основе корневой папки.

при использовании полного пути, оба, 'getResource' методы запустятся в корневой папке.

8
ответ дан nbeyer 24 November 2019 в 11:06
поделиться
resourcesloader.class.getClass()

Может быть сломан к:

Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();

, Что означает, что Вы пытаетесь загрузить ресурс с помощью класса начальной загрузки.

Вместо этого Вы, вероятно, хотите что-то как:

resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

, Если только javac предупредил о вызове статических методов для нестатических контекстов...

2
ответ дан Tom Hawtin - tackline 24 November 2019 в 11:06
поделиться

Самка следующая работа?

resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")

там причина, Вы не можете указать полный путь включая пакет?

1
ответ дан RichH 24 November 2019 в 11:06
поделиться

Для получения реального пути к файлу, можно попробовать это:

URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks");
String pathToClass = fileUrl.getPath;    

Resourceloader является именем класса здесь. "resources/repository/SSL-Key/cert.jks" является относительным путем в файл. Если бы у Вас был свой guiclass в./package1/java с отдыхом остающейся структуры папок, то Вы взяли бы "../resources/repository/SSL-Key/cert.jks" в качестве относительного пути из-за правил, определяющих относительный путь.

Этот путь можно считать файл с BufferedReader. НЕ ИСПОЛЬЗУЙТЕ СТРОКУ для идентификации пути к файлу, потому что, если у Вас есть пробелы или некоторые символы от не английский алфавит в Вашем пути, Вы получите проблемы, и файл не будет найден.

BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(fileUrl.openStream()));
0
ответ дан 24 November 2019 в 11:06
поделиться

У меня были проблемы с использованием метода getClass().getResource("filename.txt"). После прочтения инструкций Java docs, если ваш ресурс не находится в том же пакете, что и класс, из которого вы пытаетесь получить доступ к ресурсу, то вы должны указать ему относительный путь, начиная с '/'. Рекомендуемая стратегия - поместить файлы ваших ресурсов в папку "ресурсы" в корневом каталоге. Так, например, если у вас есть структура:

src/main/com/mycompany/myapp

то вы можете добавить папку ресурсов, как рекомендует maven в:

src/main/resources

кроме того, вы можете добавить подпапки в папку ресурсов

src/main/resources/textfiles

и сказать, что ваш файл называется myfile.txt, так что у вас есть

src/main/resources/textfiles/myfile.txt

Теперь вот где возникает дурацкая проблема с путями. Скажем, что у вас есть класс в вашем пакете com.mycompany.myapp, и вы хотите получить доступ к файлу myfile.txt из папки ресурсов. Некоторые говорят, что вы должны дать:

"/main/resources/textfiles/myfile.txt" path

или

"/resources/textfiles/myfile.txt"

оба эти файла неправильные. После того, как я запустил mvn clean compile, файлы и папки копируются в:

myapp/target/classes 

папку. Но папки ресурсов там нет, только папки в папке ресурсов. Так что у вас есть:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

так что правильный путь к методу getClass().getResource(""):

"/textfiles/myfile.txt"

вот он:

getClass().getResource("/textfiles/myfile.txt")

Он больше не будет возвращать ноль, а вернет ваш класс. Надеюсь, это кому-то поможет. Мне странно, что папка "resources" тоже не копируется, а только вложенные папки и файлы непосредственно в папку "resources". Мне кажется логичным, что папка "resources" также находится под "myapp/target/classes"

146
ответ дан 24 November 2019 в 11:06
поделиться
Другие вопросы по тегам:

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