Использование выражения Immediately-Вызываемой функции - самый простой и удобный способ заключить индексную переменную:
for (var i = 0; i < 3; i++) {
(function(index) {
console.log('iterator: ' + index);
//now you can also loop an ajax call here
//without losing track of the iterator value: $.ajax({});
})(i);
}
Это отправляет итератору i
в анонимный функцию которого мы определяем как index
. Это создает закрытие, где переменная i
сохраняется для последующего использования в любых асинхронных функциях внутри IIFE.
У вас есть следующие значения NOT NULL в определении вашей базы данных:
CONTENT
PATH
VIDEO
TIME
Но в вашем addDB вы добавляете CONTENT и TIME в ContentValues, чтобы он определенно искал PATH и VIDEO. Если они отсутствуют, это даст ошибку. Существует два решения:
Решение 1:
удалить NOT NULL ограничение из VIDEO и PATH:
db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT
+ " TEXT NOT NULL," + PATH
+ " TEXT," + VIDEO
+ " TEXT," + TIME
+ " TEXT NOT NULL)");
Решение 2:
добавить VIDEO и PATH в ContentValues:
private void addDB() {
ContentValues cv = new ContentValues();
cv.put(SecretAlbumDB.CONTENT, editText.getText().toString());
cv.put(SecretAlbumDB.TIME, getTime());
cv.put(SecretAlbumDB.VIDEO, getVideo());
cv.put(SecretAlbumDB.Path, getPath());
dbWriter.insert(SecretAlbumDB.TABLE_NAME, null, cv);
}
Конечно, вы объявили все поля (столбцы) как NOT NULL
, и вы не поместили значение в эти поля при вставке cv
. Либо сделайте эти столбцы null
приемлемыми, либо поместите все значения в cv
для всех столбцов, которые являются NOT NULL
.