Страницы

Поиск по вопросам

воскресенье, 26 мая 2019 г.

Отсутствует таблица в SQLite

android.database.sqlite.SQLiteException: no such table: RESUME (code 1): , while compiling: SELECT DISTINCT * FROM RESUME
Потому что в предыдущей версии этой таблицы "RESUME" не было. Щас добавил и запустил и получил эту ошибку.
Как исправить эту ошибку (кроме удаления приложения и заново запустить или очистки кэша)?


Ответ

Почему никто не читает документацию? Создайте дополнительную таблицу в методе SQLiteOpenHelper.onUpgrade()
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("create table resume ..."); } }

Неправильно показывает текущий месяц

Здраствуйте!Мне нужно получить текущую дату и время.Все отображается корректно ,кроме месяца:показывает 11-й месяц.
java.util.Calendar c = java.util.Calendar.getInstance(); String sDate = c.get(Calendar.YEAR) + "." + c.get(Calendar.MONTH) + "." + c.get(Calendar.DAY_OF_MONTH) + " в " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE); tv.setText(sDate);


Ответ

Потому что, январь начинается с 0, соответственно декабрь - 11-й месяц. Если хотите получить именно 12 вместо 11, то можно написать так)
c.get(Calendar.MONTH)+1;
Вот еще вариант, только вместо 12 возвращает сокращенный вариант месяца "дек",
SimpleDateFormat sdfMM = new SimpleDateFormat("MMM"); sdfMM.format(c.get(Calendar.MONTH);
И чтобы получить "декабрь"
SimpleDateFormat sdfMMM = new SimpleDateFormat("MMMM"); sdfMMM.format(c.get(Calendar.MONTH);

Доступ к private членам шаблонного класса

template class A { int x;
public: void foo() { A<1> a; //a.x; // Как получить прямой доступ к x для инстанциаций A, i != 1? } };


Ответ

Так сойдет?
template class A { int x;
template friend class A;
public: void foo() { A<5> a5; cout << a5.x; A<2> a2; cout << a2.x; } };

int main(int argc, const char * argv[]) { A<8> x; x.foo(); }

Push. Внутренние папки в репозитории

Запушил на bitbucket свой локальный репозиторий, но папка(не пустая), которая была в нем не добавилась. Как ее запушить? Использую программу Git GUI


Ответ

Git не версионирует папки сами по себе, только файлы. Чтобы добавилась папка, нужно добавить хотя бы один файл из неё.
# Можно добавить всё содержимое папки git add foo # но достаточно хотя бы одного файла git add foo/file.txt git commit -m'message' # теперь папка добавлена
Если файлов в папке нет, то есть общепринятая практика — создать файл с именем .gitkeep (точка в начале важна).
# создаём пустой файл любым способом, например через touch touch foo/.gitkeep git add foo/.gitkeep git commit -m'message'

Если вы проделали вышеуказанные инструкции, но не видите папку при просмотре файлов на Bitbucket (или GitHub, GitLab и т.п.), проверьте выбранную в данный момент ветку. Все эти сервисы по умолчанию показывают состояние из ветки master. Если ваша папка была добавлена в другой ветке, нужно переключиться на просмотр этой ветки.

Проверка принадлежности числа множеству

Есть ли специальные операторы в c# для определения принадлежности числа множеству? Аналог в паскале: 2 in [1..4], возвращает true в данном случае.


Ответ

Как вариант, можно написать метод или даже метод-расширение:
public static class RangeHelper { public static bool IsInRange(this int x, int start, int end) => x >= start && x <= end; }
Использовать так:
if (2.IsInRange(1, 4)) { ... }

Раздать интернет в локальную сеть

У меня есть домашняя сеть на два компьютера. Первый (c linux mint 17.2 64 bit) - это тот, который подключен к интернету через кабель, и от него же идет кабель ко второму (с windows).
Сетевые карточки определились, интернет есть и сеть тоже есть, но я не могу раздать интернет. На компьютере с windows написано "без доступа к Интернету", хотя на линуксовом пишет, что подключение есть.
Как мне раздать интернет на оба компьютера?


Ответ

копия моего ответа на идентичный по сути, но иной по форме вопрос:

если на компьютерах в подсети шлюзом по умолчанию указано использование того самого сервера, который вы настраиваете, то достаточно:
разрешить на этом сервере передачу пакетов между интерфейсами:
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
для того, чтобы эта настройка применялась и после перезагрузки, раскомментируйте (или добавьте, если нет) строку в /etc/sysctl.conf
net.ipv4.ip_forward=1 проконтролировать, что эти пакеты не искажаются и не блокируются netfilter-ом (см. вывод $ sudo iptables-save). добавить правило netfiler-а для подмены адреса отправителя у пакетов, поступивших с «внутреннего» интерфейса, и уходящих на внешний интерфейс:
$ sudo iptables -t nat -A POSTROUTING -o внешний_интерфейс -j MASQUERADE
если же на этих компьютерах шлюзом по умолчанию служит другая машина (или вообще таковой не задан), то, в дополнение к разрешению передачи пакетов между интерфейсами, вам ещё придётся эти пакеты «искажать».
как минимум потребуется подмена адреса источника у пакетов, поступивших на «внешний» интерфейс, и адресованных компьютерам подсети, а также обратная подмена адреса назначения у «ответных» пакетов.
оба данных действия может выполнять директива netfilter-а под названием snat (source nat). пример её добавления с помощью программы iptables
$ sudo iptables -t nat -A POSTROUTING -o внутренний_интерфейс -j SNAT --to-source ip-адрес
где ip-адрес — адрес, закреплённый за «внутренним» интерфейсом.

для того, чтобы не вводить упомянутые выше одну или две команды (iptables ...) после каждой перезагрузки настраиваемого сервера, их можно добавить, например, в конец файла /etc/rc.local, но до строки exit 0, которая там обычно присутствует (если нет — просто добавляйте в конец файла). добавка sudo, конечно, в этом файле не нужна.

Entity Framework. Несколько связей многие ко многим между двумя таблицами

Используется Code First.
Есть модели Productи User. Пользователь может иметь много продуктов купленных онлайн и много купленных оффлайн. В то же время у продукта есть список пользователей, которые приобрели онлайн и список оффлайн соответственно.
Получается мы имеем 2 связи многие ко многим. Как реализовать это в классах моделей?
public class Product { public int Id { get; set; } public int Price { get; set; }
public virtual ICollection OnlineCustomers { get; set; } public virtual ICollection OfflineCustomers { get; set; } }
public class User { public int Id { get; set; } public string Name { get; set; }
public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } }
Насколько знаю, при связи многие ко многим EF автоматически создает третью таблицу, именуя ее ProductUsers. Но если связи две, как будут именоваться дополнительные таблицы? И как можно изменить правило именования промежуточных таблиц, каким атрибутом или Fluent API?


Ответ

Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(q => q.OnlineCustomers) .WithMany(q => q.OnlinePurchases) .Map(q => { q.ToTable("OnlineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); });
modelBuilder.Entity() .HasMany(q => q.OfflineCustomers) .WithMany(q => q.OfflinePurchases) .Map(q => { q.ToTable("OfflineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); }); }
Всего будет 4 таблицы: Product, User, OnlineProductUsers, OfflineProductUsers
Data Annotations
public class Product { public int Id { get; set; } public int Price { get; set; }
[InverseProperty("OnlinePurchases")] public virtual ICollection OnlineCustomers { get; set; } [InverseProperty("OfflinePurchases")] public virtual ICollection OfflineCustomers { get; set; } }
public class User { public int Id { get; set; } public string Name { get; set; }
public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } }
Недостаток в том, что EF сам придумает названия новым таблицам
Всего будет 4 таблицы: Product, User, ProductUsers, ProductUser1