Посмотрите логи logcat. Метод insert
регистрирует, почему он возвратил ноль. Например, у меня возникла та же проблема, и она позволила мне найти причину:
SQLiteDatabase(26594): android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE)
Так что в моем случае я пытался сохранить файл с именем, которое уже существовало.
РЕДАКТИРОВАТЬ:
Больше точности по моей проблеме:
Я создавал имя файла "hello.png" с resolver.insert(...)
, как вы. Обычно, если файл с таким именем уже существует в файловой системе, новый файл автоматически переименовывается в «hello (x) .png»
Затем для целей тестирования мне пришлось удалить этот файл с помощью adb, используя adb shell rm -rf <myFolder>
. Но это была моя ошибка.
Начиная с Android 10, вы должны использовать ContentResolver и Media Store, который является базой данных, отслеживающей файлы, сохраненные приложением. rm -rf
не обновляет эту базу данных, поэтому для файловой системы файл с именем hello.png
не существовал (тогда файл не переименовывается в hello (1).png
). Но в базе данных была запись о том, что такой файл существует, отсюда исключение SQLiteConstraintException
.
Вкл. Android 10+, чтобы удалить файл, созданный приложением , вы должны использовать
adb shell content delete <args>
adb shell content
, позволяющие вам делать SQL подобные запросы к базе данных ContentResolver. Например:
adb shell content query --uri content://media/external/images/media
создает список всех внешних изображений. Затем вы можете создать правильный запрос для удаления нужного файла (ов).
В моем случае это было:
adb shell content delete --uri content://media/external/images/media --where bucket_display_name="\'HelloCollection\'"
Эта команда как удалит запись в базе данных, так и удалит файл в файловой системе.