Android. SQLite пример использования
Нашел очень классный пример работы с БД SQLite на http://hmkcode.com/android-simple-sqlite-database-tutorial/, настолько наглядный, что переписал его себе.
1. Класс для работы с записями таблице:
2. Класс для работы с БД:
2. И пример использования:
На основании этой статьи была разработана программа для автоматиеского создания java классов для работы с БД SQLite - SQLiteCreator.
1. Класс для работы с записями таблице:
package com.hmkcode.android.model; public class Book { private int id; private String title; private String author; public Book(){} public Book(String title, String author) { super(); this.title = title; this.author = author; } //getters & setters @Override public String toString() { return "Book [id=" + id + ", title=" + title + ", author=" + author + "]"; } }
2. Класс для работы с БД:
package com.hmkcode.android.sqlite; import java.util.LinkedList; import java.util.List; import com.hmkcode.android.model.Book; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class MySQLiteHelper extends SQLiteOpenHelper { // Database Version private static final int DATABASE_VERSION = 1; // Database Name private static final String DATABASE_NAME = "BookDB"; public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // SQL statement to create book table String CREATE_BOOK_TABLE = "CREATE TABLE books ( " + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, "+ "author TEXT )"; // create books table db.execSQL(CREATE_BOOK_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older books table if existed db.execSQL("DROP TABLE IF EXISTS books"); // create fresh books table this.onCreate(db); } //--------------------------------------------------------------------- /** * CRUD operations (create "add", read "get", update, delete) book + get all books + delete all books */ // Books table name private static final String TABLE_BOOKS = "books"; // Books Table Columns names private static final String KEY_ID = "id"; private static final String KEY_TITLE = "title"; private static final String KEY_AUTHOR = "author"; private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR}; public void addBook(Book book){ Log.d("addBook", book.toString()); // 1. get reference to writable DB SQLiteDatabase db = this.getWritableDatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put(KEY_TITLE, book.getTitle()); // get title values.put(KEY_AUTHOR, book.getAuthor()); // get author // 3. insert db.insert(TABLE_BOOKS, // table null, //nullColumnHack values); // key/value -> keys = column names/ values = column values // 4. close db.close(); } public Book getBook(int id){ // 1. get reference to readable DB SQLiteDatabase db = this.getReadableDatabase(); // 2. build query Cursor cursor = db.query(TABLE_BOOKS, // a. table COLUMNS, // b. column names " id = ?", // c. selections new String[] { String.valueOf(id) }, // d. selections args null, // e. group by null, // f. having null, // g. order by null); // h. limit // 3. if we got results get the first one if (cursor != null) cursor.moveToFirst(); // 4. build book object Book book = new Book(); book.setId(Integer.parseInt(cursor.getString(0))); book.setTitle(cursor.getString(1)); book.setAuthor(cursor.getString(2)); Log.d("getBook("+id+")", book.toString()); // 5. return book return book; } // Get All Books public List<Book> getAllBooks() { List<Book> books = new LinkedList<Book>(); // 1. build the query String query = "SELECT * FROM " + TABLE_BOOKS; // 2. get reference to writable DB SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); // 3. go over each row, build book and add it to list Book book = null; if (cursor.moveToFirst()) { do { book = new Book(); book.setId(Integer.parseInt(cursor.getString(0))); book.setTitle(cursor.getString(1)); book.setAuthor(cursor.getString(2)); // Add book to books books.add(book); } while (cursor.moveToNext()); } Log.d("getAllBooks()", books.toString()); // return books return books; } // Updating single book public int updateBook(Book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getWritableDatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put("title", book.getTitle()); // get title values.put("author", book.getAuthor()); // get author // 3. updating row int i = db.update(TABLE_BOOKS, //table values, // column/value KEY_ID+" = ?", // selections new String[] { String.valueOf(book.getId()) }); //selection args // 4. close db.close(); return i; } // Deleting single book public void deleteBook(Book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getWritableDatabase(); // 2. delete db.delete(TABLE_BOOKS, KEY_ID+" = ?", new String[] { String.valueOf(book.getId()) }); // 3. close db.close(); Log.d("deleteBook", book.toString()); } }
2. И пример использования:
package com.hmkcode.android; import java.util.List; import com.hmkcode.android.model.Book; import com.hmkcode.android.sqlite.MySQLiteHelper; import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MySQLiteHelper db = new MySQLiteHelper(this); /** * CRUD Operations * */ // add Books db.addBook(new Book("Android Application Development Cookbook", "Wei Meng Lee")); db.addBook(new Book("Android Programming: The Big Nerd Ranch Guide", "Bill Phillips and Brian Hardy")); db.addBook(new Book("Learn Android App Development", "Wallace Jackson")); // get all books List<Book> list = db.getAllBooks(); // delete one book db.deleteBook(list.get(0)); // get all books db.getAllBooks(); } }
На основании этой статьи была разработана программа для автоматиеского создания java классов для работы с БД SQLite - SQLiteCreator.
Игра "Клад"
Реинкарнация игры "Клад" с некогда популярного ПК "Корвет". Разработана "с нуля" (Delphi+DiretX) в минуты теплых воспоминаний о тех временах, когда "БК0010", "Корветы", "Спектрумы" и "Микроши" были самыми крутыми компами во Вселенной... Оригинальная графика сохранена... Есть редактор уровней.
Игра "Клад" с ПК "Корвет"
Скачать игру "Клад" с ПК "Корвет" на PC.
Версия игры Клад для Android
Прямая ссылка на Google Play.
Скачать игру "Клад" с ПК "Корвет" на PC.
Прямая ссылка на Google Play.
Технология. Изготовление печатных плат методом ЛУт
Суть изготовления печатных плат лазерно-утюжным методом (ЛУт) заключается в термическом переносе отпечатанной на лазерном принтере печатной платы на фольгированный текстолит с последующим травлением в хлорном железе.
В Интернете есть достаточно советов по этой технологии, и любым из них вы можете воспользоваться. Я расскажу о своем опыте изготовления печатных плат.
Разработку печатных плат я выполняю в программе Sprint-Layout версии 5.0. Программа коммерческая, поэтому для соблюдения лицензионных приличий даю ссылку только на ограниченную версию этой замечательной программы. Версию, для пользователей постсоветского пространства вы можете найти погуглив, например, «Sprint-Layout 5.0 скачать»
Разработка печатной платы в программе Sprint-Layout v. 5.0
В случае изготовления двухсторонней платы, перед печатью на бумаге слои необходимо разделить. Делается это путем дублирования платы, отражения ее по вертикали/горизонтали и удаления ненужных дорожек на каждом слое. При копировании расстояние между платами должно составлять сантиметра полтора. В итоге получаем:
Подготовка двухсторонней печатной платы к печати в программе Sprint-Layout v. 5.0
Выбираю «Файл-Печать». В появившемся окне выполняю следующие настройки:
- Настраиваю цвета дорожек (для слоя M1 и M2 устанавливаю «черный»).
- Скрываю ненужные слои (K1, K2).
- Настраиваю количество копий на листе (кнопка «Копии…»).
- Настраиваю вид печати «Нормальный» (не «Зеркальный»).
Печать платы в программе Sprint-Layout v. 5.0
Бумагу – в принтер. Печатаю.
Несколько слов о бумаге. Я, например, беру фирменные бланки. Некоторые используют фотобумагу для печати на струйных принтерах, другие – страницы из «глянцевых» журналов. Тут тебе придется поэкспериментировать и выбрать для себя подходящий вариант.
Если возникают проблемы при печати, например, некоторые принтеры категорически не переваривают «лащенку», или при печати на «тонких» листах их разрывает, то можно поэкспериментировать с типом бумаги в настройках принтера. У меня, например, нормальная печать получилась на типе бумаги «Пленка».
Вырезаю один экземпляр платы.
Вырезанный экземпляр печатной платы
Совмещаю «отверстия» «на просвет». Загибаю бумагу. Еще раз проверяю, что бы все отверстия были расположены как надо (в момент «изгиба» могло произойти смещение слоев).
Совмещение слоев платы
Склеиваю свободный край.
Изготовление конверта
Получаю нечто похожее на «конверт».
Готовый конверт
Такую технологию (изготовление «конверта») я рекомендую и при изготовлении односторонних плат - это позволит зафиксировать текстолит внутри, а для двухсторонней платы – еще и правильно удерживать слои относительно друг друга.
Покуда «конверт» сохнет межу страницами какой то книги - готовлю текстолит.
Размер текстолита +5...7 мм с каждой стороны к размеру готовой платы. Это позволит не заморачиваться с зачисткой краев текстолита (как правило, при переводе дорожек именно там возникают проблемы), а так же с точной установкой платы внутри конверта.
Зачищаю медь текстолита до отсутствия окисления и получения характерного блеска: в зависимости от состояния текстолита – сначала наждачкой покрупнее, потом – нулевкой. При изготовлении двухсторонней платы - стараюсь меньше лапать пальцами за уже зачищенный противоположный слой.
Следующий этап – обезжиривание печатной платы. Для чего я беру два кусочка фланелевой тряпки (от ваты отказался т.к. после нее остаются ворсинки) – один смочен в растворителе, второй - сухой. Обезжиривание веду тряпкой, смоченной в растворителе постепенно протирая и перемещаясь от одного края к другому (а не круговыми движениями) - это позволяет лучше смыть и меньше размазывать частички меди по поверхности платы. Что бы не оставалось пятен после растворителя, сразу же после протирки «влажной тряпкой» вытираю поверхность платы сухой.
Теперь все готово для перевода дорожек с бумаги на текстолит. Готовлю рабочее место (у меня это стул, на стуле сантиметровая кипа газет), набираю в емкость холодной воды, включаю утюг и жду прогрева (3-4 мин, температура - на максимум, температуру подбирал опытным путем).
В конверт вставляю плату. Взгляд на просвет, что бы дорожки не «свешивались» с края платы. Кладу плату на газетную стопку, и плашмя, с достаточным усилием прижимаю утюг к плате на секунд 10. Это позволяет тонеру первоначально прилипнуть к текстолиту. Затем утюг устанавливаю на «ребро» и ребром, не торопясь, с усилием, выглаживаю плату. Вся процедура занимает секунд 30-40. Если плата двухсторонняя, переворачиваю плату и опять же «ребром» выглаживаю противоположную сторону. Не давая плате остыть, бросаю ее в емкость с водой (у меня, если плата остывала «естественным» путем бывало что дорожки частично прилипали к бумаге обратно).
Плата откисает примерно минуту. За это время бумага размокает и смывается без труда. Проверяю что получилось. Если есть необходимость - видимые короткие замыкания устраняю тонким шилом. Если оттиск получился совсем уж плохенький, смываю тонер растворителем и перехожу к этапу «зачистка мелкой наждачкой».
Травлю плату в хлорном железе. Это примерно минут 20-60 в зависимости от свежести раствора и его температуры. Более агрессивная среда (соляная кислота + гидроперит) разъедает тонер. Более слабая - раствор медного купороса и соли - долго травит.
После травления платы – промывка под краном в холодной воде с хозяйственным мылом.
Тонер пока не снимаю. Проверяю плату «на свет» на предмет видимых коротких замыканий. Их наличие устраняю с помощью шила.
Подрезаю плату в размер. Сверлю отверстия. Использую сверла диаметром 0.6, 0.8, 1.0, 1.2, 2.5, 3.0 мм в зависимости от технологического назначения отверстия. Отверстия сверлю небольшой ручной 12-и вольтовой самодельной дрелькой.
Сверление отверстий
Из-за того что некоторые сверла уже давно б/у, при сверлении, по краю отверстия появляется «наплыв» меди. Его устраняю после сверления всех отверстий, используя «нулевочку», ей же снимаю некоторый слой тонера. Остатки тонера смываю растворителем. Последний штрих – легкая зачистка дорожек мелкой наждачкой до блеска и покрытие платы жидкой канифолью. Сушка.
Готовая печатная плата
Лужение дорожек либо не выполняю вовсе (плата покрыта канифолью и на этапе сборки и отладки девайса не успевает окислится), либо выполняю в момент пайки элементов.
После того как устройство собрано и отлажено смываю остатки канифоли растворителем и покрываю плату прозрачным лаком.
В Интернете есть достаточно советов по этой технологии, и любым из них вы можете воспользоваться. Я расскажу о своем опыте изготовления печатных плат.
Разработку печатных плат я выполняю в программе Sprint-Layout версии 5.0. Программа коммерческая, поэтому для соблюдения лицензионных приличий даю ссылку только на ограниченную версию этой замечательной программы. Версию, для пользователей постсоветского пространства вы можете найти погуглив, например, «Sprint-Layout 5.0 скачать»
В случае изготовления двухсторонней платы, перед печатью на бумаге слои необходимо разделить. Делается это путем дублирования платы, отражения ее по вертикали/горизонтали и удаления ненужных дорожек на каждом слое. При копировании расстояние между платами должно составлять сантиметра полтора. В итоге получаем:
Выбираю «Файл-Печать». В появившемся окне выполняю следующие настройки:
- Настраиваю цвета дорожек (для слоя M1 и M2 устанавливаю «черный»).
- Скрываю ненужные слои (K1, K2).
- Настраиваю количество копий на листе (кнопка «Копии…»).
- Настраиваю вид печати «Нормальный» (не «Зеркальный»).
Бумагу – в принтер. Печатаю.
Несколько слов о бумаге. Я, например, беру фирменные бланки. Некоторые используют фотобумагу для печати на струйных принтерах, другие – страницы из «глянцевых» журналов. Тут тебе придется поэкспериментировать и выбрать для себя подходящий вариант.
Если возникают проблемы при печати, например, некоторые принтеры категорически не переваривают «лащенку», или при печати на «тонких» листах их разрывает, то можно поэкспериментировать с типом бумаги в настройках принтера. У меня, например, нормальная печать получилась на типе бумаги «Пленка».
Вырезаю один экземпляр платы.
Совмещаю «отверстия» «на просвет». Загибаю бумагу. Еще раз проверяю, что бы все отверстия были расположены как надо (в момент «изгиба» могло произойти смещение слоев).
Склеиваю свободный край.
Получаю нечто похожее на «конверт».
Такую технологию (изготовление «конверта») я рекомендую и при изготовлении односторонних плат - это позволит зафиксировать текстолит внутри, а для двухсторонней платы – еще и правильно удерживать слои относительно друг друга.
Покуда «конверт» сохнет межу страницами какой то книги - готовлю текстолит.
Размер текстолита +5...7 мм с каждой стороны к размеру готовой платы. Это позволит не заморачиваться с зачисткой краев текстолита (как правило, при переводе дорожек именно там возникают проблемы), а так же с точной установкой платы внутри конверта.
Зачищаю медь текстолита до отсутствия окисления и получения характерного блеска: в зависимости от состояния текстолита – сначала наждачкой покрупнее, потом – нулевкой. При изготовлении двухсторонней платы - стараюсь меньше лапать пальцами за уже зачищенный противоположный слой.
Следующий этап – обезжиривание печатной платы. Для чего я беру два кусочка фланелевой тряпки (от ваты отказался т.к. после нее остаются ворсинки) – один смочен в растворителе, второй - сухой. Обезжиривание веду тряпкой, смоченной в растворителе постепенно протирая и перемещаясь от одного края к другому (а не круговыми движениями) - это позволяет лучше смыть и меньше размазывать частички меди по поверхности платы. Что бы не оставалось пятен после растворителя, сразу же после протирки «влажной тряпкой» вытираю поверхность платы сухой.
Теперь все готово для перевода дорожек с бумаги на текстолит. Готовлю рабочее место (у меня это стул, на стуле сантиметровая кипа газет), набираю в емкость холодной воды, включаю утюг и жду прогрева (3-4 мин, температура - на максимум, температуру подбирал опытным путем).
В конверт вставляю плату. Взгляд на просвет, что бы дорожки не «свешивались» с края платы. Кладу плату на газетную стопку, и плашмя, с достаточным усилием прижимаю утюг к плате на секунд 10. Это позволяет тонеру первоначально прилипнуть к текстолиту. Затем утюг устанавливаю на «ребро» и ребром, не торопясь, с усилием, выглаживаю плату. Вся процедура занимает секунд 30-40. Если плата двухсторонняя, переворачиваю плату и опять же «ребром» выглаживаю противоположную сторону. Не давая плате остыть, бросаю ее в емкость с водой (у меня, если плата остывала «естественным» путем бывало что дорожки частично прилипали к бумаге обратно).
Плата откисает примерно минуту. За это время бумага размокает и смывается без труда. Проверяю что получилось. Если есть необходимость - видимые короткие замыкания устраняю тонким шилом. Если оттиск получился совсем уж плохенький, смываю тонер растворителем и перехожу к этапу «зачистка мелкой наждачкой».
Травлю плату в хлорном железе. Это примерно минут 20-60 в зависимости от свежести раствора и его температуры. Более агрессивная среда (соляная кислота + гидроперит) разъедает тонер. Более слабая - раствор медного купороса и соли - долго травит.
После травления платы – промывка под краном в холодной воде с хозяйственным мылом.
Тонер пока не снимаю. Проверяю плату «на свет» на предмет видимых коротких замыканий. Их наличие устраняю с помощью шила.
Подрезаю плату в размер. Сверлю отверстия. Использую сверла диаметром 0.6, 0.8, 1.0, 1.2, 2.5, 3.0 мм в зависимости от технологического назначения отверстия. Отверстия сверлю небольшой ручной 12-и вольтовой самодельной дрелькой.
Из-за того что некоторые сверла уже давно б/у, при сверлении, по краю отверстия появляется «наплыв» меди. Его устраняю после сверления всех отверстий, используя «нулевочку», ей же снимаю некоторый слой тонера. Остатки тонера смываю растворителем. Последний штрих – легкая зачистка дорожек мелкой наждачкой до блеска и покрытие платы жидкой канифолью. Сушка.
Лужение дорожек либо не выполняю вовсе (плата покрыта канифолью и на этапе сборки и отладки девайса не успевает окислится), либо выполняю в момент пайки элементов.
После того как устройство собрано и отлажено смываю остатки канифоли растворителем и покрываю плату прозрачным лаком.
Android. Преобразование типов переменных
Лучше чем написано на http://study-java.ru/uroki-java/urok-7-preobrazovanie-tipov-v-java/#Stringtodouble я, наверно, не напишу.
Для себя, на всякий случай, сохраню копию страницы, которую можно посмотреть тут.
Для себя, на всякий случай, сохраню копию страницы, которую можно посмотреть тут.
Android. Типовая настройка Activity
При разработке Android приложений практически всегда приходится настраивать свойства Activity. Что бы упростить этот процесс я набросал "универсальный" код настройки для своих приложений. Этот код позволяет: скрывать заголовок Activity, скрывать строку состояния (это там где часы) и задавать ориентацию экрана.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide();// Скрываем заголовок // requestWindowFeature(Window.FEATURE_NO_TITLE); // Скрываем заголовок (для некоторых версий SDK) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// Скрываем строку состояния setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // Задаем ориентацию: альбомная // setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Задаем ориентацию: портретная setContentView(R.layout.activity_main); }
Android. Версия SDK
Иногда в коде требуется определить, под какой версией SDK выполняется код. Сделать это можно так:
public void butClick(View v) { // Определяем версию SDK, под которой запущен код if (Build.VERSION.SDK_INT < 16) { ... } }
Подписаться на:
Сообщения (Atom)