Membuat Form Login Aplikasi di Basic4Android (2)
|Jika pada postingan Membuat Form Login Aplikasi di Basic4Android (1) sistem login-nya menggunakan data dari variabel string (username dan password) yang diset secara manual via code editor-nya, maka pada kali ini saya akan menggunakan data dari sebuah database. Dalam hal ini database yang saya gunakan adalah SQLite. Persiapkan database-nya dengan nama mylogin, dengan tabel user yang berisi field-field berikut: id, username, dan password. Lalu tambahkan satu record data untuk masing-masing field tsb. Khusus untuk password isikan dengan data dalam format MD5.
Kemudian taruh database-nya (mylogin.db) di folder Files yang berada di root folder project MyLogin. Karena pada bahasan ini saya akan menggunakan project MyLogin yang sebelumnya sudah dibuat. Atau jika masih bingung bagaimana cara membuat database SQLite, Anda bisa lihat postingan ini.
Oke, let’s go…
- Buka project MyLogin.
- Lalu tambahkan module baru berupa Code Module. Caranya, klik menu Project – Add New Module – Code Module.
- Pada Module Name masukkan nama Code Module yang ingin dibuat, yaitu: DBUtils. Klik Ok.
- Beralih ke DBUtils yang baru saja dibuat. Hapus semua code yang ada. Lalu masukkan code-code berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 |
' Code module ' Version 1.09 ' ' Modified: 15.06.2011 Markus Stipp ' - Version control of database (GetDBVersion and SetDBVersion Subs) ' - renamed cursor variables from c to cur since I often use a module named C for constants. ' ' Modified: 30.03.2012 Klaus Christl (klaus) ' - Added DeletRecord deletes a record, code from Erel ' - Added UpdateRecord2 updates more than one field in a record, code from vasper Sub Process_Globals Dim DB_REAL, DB_INTEGER, DB_BLOB, DB_TEXT As String DB_REAL = "REAL" DB_INTEGER = "INTEGER" DB_BLOB = "BLOB" DB_TEXT = "TEXT" Dim HtmlCSS As String HtmlCSS = "table {width: 100%;border: 1px solid #cef;text-align: left; }" _ & " th { font-weight: bold; background-color: #acf; border-bottom: 1px solid #cef; }" _ & "td,th { padding: 4px 5px; }" _ & ".odd {background-color: #def; } .odd td {border-bottom: 1px solid #cef; }" _ & "a { text-decoration:none; color: #000;}" End Sub 'Copies a database file that was added in the Files tab. The database must be copied to a writable location. 'This method copies the database to the storage card. If the storage card is not available the file is copied to the internal folder. 'The target folder is returned. 'If the database file already exists then no copying is done. Sub CopyDBFromAssets (FileName As String) As String Dim TargetDir As String If File.ExternalWritable Then TargetDir = File.DirDefaultExternal Else TargetDir = File.DirInternal If File.Exists(TargetDir, FileName) = False Then File.Copy(File.DirAssets, FileName, TargetDir, FileName) End If Return TargetDir End Sub 'Creates a new table with the given name. 'FieldsAndTypes - A map with the fields names as keys and the types as values. 'You can use the DB_... constants for the types. 'PrimaryKey - The column that will be the primary key. Pass empty string if not needed. Sub CreateTable(SQL As SQL, TableName As String, FieldsAndTypes As Map, PrimaryKey As String) Dim sb As StringBuilder sb.Initialize sb.Append("(") For i = 0 To FieldsAndTypes.Size - 1 Dim field, ftype As String field = FieldsAndTypes.GetKeyAt(i) ftype = FieldsAndTypes.GetValueAt(i) If i > 0 Then sb.Append(", ") sb.Append("[").Append(field).Append("] ").Append(ftype) If field = PrimaryKey Then sb.Append(" PRIMARY KEY") Next sb.Append(")") Dim query As String query = "CREATE TABLE IF NOT EXISTS [" & TableName & "] " & sb.ToString Log("CreateTable: " & query) SQL.ExecNonQuery(query) End Sub 'Deletes the given table. Sub DropTable(SQL As SQL, TableName As String) Dim query As String query = "DROP TABLE IF EXISTS [" & TableName & "]" Log("DropTable: " & query) SQL.ExecNonQuery(query) End Sub 'Inserts the data to the table. 'ListOfMaps - A list with maps as items. Each map represents a record where the map keys are the columns names 'and the maps values are the values. 'Note that you should create a new map for each record (this can be done by calling Dim to redim the map). Sub InsertMaps(SQL As SQL, TableName As String, ListOfMaps As List) Dim sb, columns, values As StringBuilder 'Small check for a common error where the same map is used in a loop If ListOfMaps.Size > 1 AND ListOfMaps.Get(0) = ListOfMaps.Get(1) Then Log("Same Map found twice in list. Each item in the list should include a different map object.") ToastMessageShow("Same Map found twice in list. Each item in the list should include a different map object.", True) Return End If SQL.BeginTransaction Try For i1 = 0 To ListOfMaps.Size - 1 sb.Initialize columns.Initialize values.Initialize Dim listOfValues As List listOfValues.Initialize sb.Append("INSERT INTO [" & TableName & "] (") Dim m As Map m = ListOfMaps.Get(i1) For i2 = 0 To m.Size - 1 Dim col As String Dim value As Object col = m.GetKeyAt(i2) value = m.GetValueAt(i2) If i2 > 0 Then columns.Append(", ") values.Append(", ") End If columns.Append("[").Append(col).Append("]") values.Append("?") listOfValues.Add(value) Next sb.Append(columns.ToString).Append(") VALUES (").Append(values.ToString).Append(")") If i1 = 0 Then Log("InsertMaps (first query out of " & ListOfMaps.Size & "): " & sb.ToString) SQL.ExecNonQuery2(sb.ToString, listOfValues) Next SQL.TransactionSuccessful Catch ToastMessageShow(LastException.Message, True) Log(LastException) End Try SQL.EndTransaction End Sub ' updates a single field in a record ' Field is the column name Sub UpdateRecord(SQL As SQL, TableName As String, Field As String, NewValue As Object, _ WhereFieldEquals As Map) Dim sb As StringBuilder sb.Initialize sb.Append("UPDATE [").Append(TableName).Append("] SET [").Append(Field).Append("] = ? WHERE ") If WhereFieldEquals.Size = 0 Then Log("WhereFieldEquals map empty!") Return End If Dim args As List args.Initialize args.Add(NewValue) For i = 0 To WhereFieldEquals.Size - 1 If i > 0 Then sb.Append(" AND ") sb.Append("[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?") args.Add(WhereFieldEquals.GetValueAt(i)) Next Log("UpdateRecord: " & sb.ToString) SQL.ExecNonQuery2(sb.ToString, args) End Sub ' updates multiple fields in a record ' in the Fields map the keys are the column names Sub UpdateRecord2(SQL As SQL, TableName As String, Fields As Map, WhereFieldEquals As Map) If WhereFieldEquals.Size = 0 Then Log("WhereFieldEquals map empty!") Return End If If Fields.Size = 0 Then Log("Fields empty") Return End If Dim sb As StringBuilder sb.Initialize sb.Append("UPDATE [").Append(TableName).Append("] SET ") Dim args As List args.Initialize For i=0 To Fields.Size-1 If i<>Fields.Size-1 Then sb.Append("[").Append(Fields.GetKeyAt(i)).Append("]=?,") Else sb.Append("[").Append(Fields.GetKeyAt(i)).Append("]=?") End If args.Add(Fields.GetValueAt(i)) Next sb.Append(" WHERE ") For i = 0 To WhereFieldEquals.Size - 1 If i > 0 Then sb.Append(" AND ") End If sb.Append("[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?") args.Add(WhereFieldEquals.GetValueAt(i)) Next Log("UpdateRecord: " & sb.ToString) SQL.ExecNonQuery2(sb.ToString, args) End Sub 'Executes the query and returns the result as a list of arrays. 'Each item in the list is a strings array. 'StringArgs - Values to replace question marks in the query. Pass Null if not needed. 'Limit - Limits the results. Pass 0 for all results. Sub ExecuteMemoryTable(SQL As SQL, Query As String, StringArgs() As String, Limit As Int) As List Dim cur As Cursor If StringArgs <> Null Then cur = SQL.ExecQuery2(Query, StringArgs) Else cur = SQL.ExecQuery(Query) End If Log("ExecuteMemoryTable: " & Query) Dim table As List table.Initialize If Limit > 0 Then Limit = Min(Limit, cur.RowCount) Else Limit = cur.RowCount For row = 0 To Limit - 1 cur.Position = row Dim values(cur.ColumnCount) As String For col = 0 To cur.ColumnCount - 1 values(col) = cur.GetString2(col) Next table.Add(values) Next cur.Close Return table End Sub 'Executes the query and returns a Map with the column names as the keys 'and the first record values As the entries values. 'The keys are lower cased. 'Returns Null if no results found. Sub ExecuteMap(SQL As SQL, Query As String, StringArgs() As String) As Map Dim cur As Cursor If StringArgs <> Null Then cur = SQL.ExecQuery2(Query, StringArgs) Else cur = SQL.ExecQuery(Query) End If Log("ExecuteMap: " & Query) If cur.RowCount = 0 Then Log("No records found.") Return Null End If Dim res As Map res.Initialize cur.Position = 0 For i = 0 To cur.ColumnCount - 1 res.Put(cur.GetColumnName(i).ToLowerCase, cur.GetString2(i)) Next cur.Close Return res End Sub 'Executes the query and fills the Spinner with the values in the first column Sub ExecuteSpinner(SQL As SQL, Query As String, StringArgs() As String, Limit As Int, Spinner1 As Spinner) Spinner1.Clear Dim Table As List Table = ExecuteMemoryTable(SQL, Query, StringArgs, Limit) Dim Cols() As String For i = 0 To Table.Size - 1 Cols = Table.Get(i) Spinner1.Add(Cols(0)) Next End Sub 'Executes the query and fills the ListView with the value. 'If TwoLines is true then the first column is mapped to the first line and the second column is mapped 'to the second line. 'In both cases the value set to the row is the array with all the records values. Sub ExecuteListView(SQL As SQL, Query As String, StringArgs() As String, Limit As Int, ListView1 As ListView, _ TwoLines As Boolean) ListView1.Clear Dim Table As List Table = ExecuteMemoryTable(SQL, Query, StringArgs, Limit) Dim Cols() As String For i = 0 To Table.Size - 1 Cols = Table.Get(i) If TwoLines Then ListView1.AddTwoLines2(Cols(0), Cols(1), Cols) Else ListView1.AddSingleLine2(Cols(0), Cols) End If Next End Sub 'Executes the given query and creates a Map that you can pass to JSONGenerator and generate JSON text. 'DBTypes - Lists the type of each column in the result set. 'Usage example: (don't forget to add a reference to the JSON library) ' Dim gen As JSONGenerator ' gen.Initialize(DBUtils.ExecuteJSON(SQL, "SELECT Id, Birthday FROM Students", Null, _ ' 0, Array As String(DBUtils.DB_TEXT, DBUtils.DB_INTEGER))) ' Dim JSONString As String ' JSONString = gen.ToPrettyString(4) ' Msgbox(JSONString, "") Sub ExecuteJSON (SQL As SQL, Query As String, StringArgs() As String, Limit As Int, DBTypes As List) As Map Dim table As List Dim cur As Cursor If StringArgs <> Null Then cur = SQL.ExecQuery2(Query, StringArgs) Else cur = SQL.ExecQuery(Query) End If Log("ExecuteJSON: " & Query) Dim table As List table.Initialize If Limit > 0 Then Limit = Min(Limit, cur.RowCount) Else Limit = cur.RowCount For row = 0 To Limit - 1 cur.Position = row Dim m As Map m.Initialize For i = 0 To cur.ColumnCount - 1 Select DBTypes.Get(i) Case DB_TEXT m.Put(cur.GetColumnName(i), cur.GetString2(i)) Case DB_INTEGER m.Put(cur.GetColumnName(i), cur.GetLong2(i)) Case DB_REAL m.Put(cur.GetColumnName(i), cur.GetDouble2(i)) Case Else Log("Invalid type: " & DBTypes.Get(i)) End Select Next table.Add(m) Next cur.Close Dim root As Map root.Initialize root.Put("root", table) Return root End Sub 'Creates a html text that displays the data in a table. 'The style of the table can be changed by modifying HtmlCSS variable. Sub ExecuteHtml(SQL As SQL, Query As String, StringArgs() As String, Limit As Int, Clickable As Boolean) As String Dim Table As List Dim cur As Cursor If StringArgs <> Null Then cur = SQL.ExecQuery2(Query, StringArgs) Else cur = SQL.ExecQuery(Query) End If Log("ExecuteHtml: " & Query) If Limit > 0 Then Limit = Min(Limit, cur.RowCount) Else Limit = cur.RowCount Dim sb As StringBuilder sb.Initialize sb.Append("<html><body>").Append(CRLF) sb.Append("<style type='text/css'>").Append(HtmlCSS).Append("</style>").Append(CRLF) sb.Append("<table><tr>").Append(CRLF) For i = 0 To cur.ColumnCount - 1 sb.Append("<th>").Append(cur.GetColumnName(i)).Append("</th>") Next ' For i = 0 To cur.ColumnCount - 1 ' If i = 1 Then ' sb.Append("<th style='width:200px;'>").Append(cur.GetColumnName(i)).Append("</th>") ' Else ' sb.Append("<th>").Append(cur.GetColumnName(i)).Append("</th>") ' End If ' Next sb.Append("</tr>").Append(CRLF) For row = 0 To Limit - 1 cur.Position = row If row Mod 2 = 0 Then sb.Append("<tr>") Else sb.Append("<tr class='odd'>") End If For i = 0 To cur.ColumnCount - 1 sb.Append("<td>") If Clickable Then sb.Append("<a href='http://").Append(i).Append(".") sb.Append(row) sb.Append(".com'>").Append(cur.GetString2(i)).Append("</a>") Else sb.Append(cur.GetString2(i)) End If sb.Append("</td>") Next sb.Append("</tr>").Append(CRLF) Next cur.Close sb.Append("</table></body></html>") Return sb.ToString End Sub 'Gets the current version of the database. If the DBVersion table does not exist it is created and the current 'version is set to version 1. Sub GetDBVersion (SQL As SQL) As Int Dim count, version As Int count = SQL.ExecQuerySingleResult("SELECT count(*) FROM sqlite_master WHERE Type='table' AND name='DBVersion'") If count > 0 Then version = SQL.ExecQuerySingleResult("SELECT version FROM DBVersion") Else 'Create the versions table. Dim m As Map m.Initialize m.Put("version", DB_INTEGER) CreateTable(SQL, "DBVersion", m, "version") SQL.ExecNonQuery("INSERT INTO DBVersion VALUES (1)") version = 1 End If Return version End Sub 'Sets the database version to the given version number. Sub SetDBVersion (SQL As SQL, Version As Int) SQL.ExecNonQuery2("UPDATE DBVersion set version = ?", Array As Object(Version)) End Sub ' deletes a record Sub DeleteRecord(SQL As SQL, TableName As String, WhereFieldEquals As Map) Dim sb As StringBuilder sb.Initialize sb.Append("DELETE FROM [").Append(TableName).Append("] WHERE ") If WhereFieldEquals.Size = 0 Then Log("WhereFieldEquals map empty!") Return End If Dim args As List args.Initialize For i = 0 To WhereFieldEquals.Size - 1 If i > 0 Then sb.Append(" AND ") sb.Append("[").Append(WhereFieldEquals.GetKeyAt(i)).Append("] = ?") args.Add(WhereFieldEquals.GetValueAt(i)) Next Log("DeleteRecord: " & sb.ToString) SQL.ExecNonQuery2(sb.ToString, args) End Sub |
- Untuk dapat menggunakan fungsi-fungsi SQL, maka harus diaktifkan dulu Library SQL-nya. Caranya, pada jendela yang ada di sebelah kanan editor, klik tab Libs, lalu beri centang pada bagian SQL.
- Kemudian beralih ke Activity Main. Pada Sub Process_Globals, masukkan code berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Process_Globals 'These global variables will be declared once when the application starts. 'These variables can be accessed from all modules. 'Deklarasikan variabel object SQL-nya (ini berasal dari Library SQL). Dim SQL As SQL 'Tentukan dimana letak database disimpan, 'Yaitu di root SD Card/Android/data/folder package project/files. Dim DBDir As String : DBDir = File.DirDefaultExternal 'Tentukan nama database yang akan digunakan di project ini. Dim DBName As String : DBName = "mylogin.db" 'Tentukan nama tabel yang akan digunakan di project ini. Dim UserTable As String = "user" End Sub |
- Pada event Activity_Create ubah code yang sudah ada menjadi seperti ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Activity_Create(FirstTime As Boolean) 'Do not forget to load the layout file created with the visual designer. For example: 'Panggil layout yg akan digunakan pada activity ini Activity.LoadLayout("login") 'Set judul untuk activity ini Activity.Title = "Login" 'Saat Activity pertama kali di-create If FirstTime Then 'Jika di DBDir belum ada DBName, maka copy-kan DBName ke DBDir. If File.Exists(DBDir, DBName) = False Then File.Copy(File.DirAssets, DBName, DBDir, DBName) End If 'Initialize object SQL-nya SQL.Initialize(DBDir, DBName, True) End If End Sub |
- Buat fungsi baru dengan nama CheckLogin.
1 2 3 4 5 6 7 8 |
Sub CheckLogin(Username As String, Password As String) As Map Dim Query As String 'Enkrip password yang dimasukkan ke MD5 Dim Pwd As String = GeneratePassword(Password) Query = "select * from " & UserTable & " where username = ? and password = ?" Dim M As Map = DBUtils.ExecuteMap(SQL, Query, Array As String(Username, Pwd)) Return M End Sub |
- Lalu buat fungsi baru lagi dengan nama GeneratePassword. Nah, untuk proses enkripsi password ke MD5 dibutuhkan Library: Encryption dan ByteConverter. Jadi, silakan aktifkan library-library tsb. Caranya sama seperti langkah No. 5.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub GeneratePassword(Pwd As String) 'Untuk proses enkripsi, dibutuhkan library Encryption dan ByteConverter. Dim Data(0) As Byte Dim MD As MessageDigest Dim Bconv As ByteConverter Data = Bconv.StringToBytes(Pwd, "UTF8") Data = MD.GetMessageDigest(Data, "MD5") Dim P As String = Bconv.HexFromBytes(Data) Return P End Sub |
- Pada fungsi BtnLogin_Click ubah code yang sudah ada menjadi menjadi seperti ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub BtnLogin_Click 'Validasi jika username kosong. If EdtUsername.Text = "" Then Msgbox("Username tidak boleh kosong.", "Warning") Return End If 'Validasi jika password kosong. If EdtPassword.Text = "" Then Msgbox("Password tidak boleh kosong.", "Warning") Return End If 'Cek username dan password tsb di tabel user. Dim m As Map = CheckLogin(EdtUsername.Text, EdtPassword.Text) 'Jika username dan password benar, maka login sukses, dan buka activity Menu. 'Jika username atau password salah, maka login gagal. If m.IsInitialized = True Then Msgbox("Hai, " & m.Get("username") & CRLF & _ "Selamat datang di MyLogin.", "Login Sukses") StartActivity(Menu) Else Msgbox("Username atau Password salah.", "Login Gagal") End If End Sub |
- Save, kemudian Run/Compile project ini dalam versi Release.
- Kemudian lihat, apa yang terjadi…
Pada saat Username kosong…
Pada saat Password kosong…
Pada saat login gagal…
Pada saat login sukses…
Demikian cara membuat form login menggunakan database di Basic4Android. Dan nantikan juga tutorial-tutorial menarik lainnya seputar Basic4Android, seperti bagaimana cara membuat CRUD (Create, Read, Update, Delete) di Basic4Android, bagaimana cara membuat aplikasi barcode scanner, bagaimana cara menggunakan database MySQL di Basic4Android, dan lain sebagainya.
Silakan download source code lengkapnya di sini.
Saya coba gagal login, setelah di cek karena pada tabel yang dibuat sebelumnya (artikel sebelumnya) tidak menggunakan enskripsi MD5, sedangkan pada artikel ini menggunakan MD5.
Kan sudah saya kasih penjelasan di atas:
Di artikel sebelumnya kan tidak pakai database. Cuma pakai string biasa.
Bang, ini knp ya? pas buat dr form login(2) “Sub CheckLogin (Username As String, Password As String) As Map”
Mas di b4a ku ga ada Library: Encryption dan ByteConverter… karena pake versi bajakan,. hehe.. bisa di bantu tidak ya, untuk solusinya?
Lah, kan udah saya share link-nya di atas 😀
Mas cara ubah password pada database sqlite jadi md5 gimana ya ?
Coba buka ini. Terus input password-nya. Hasil generate-nya tinggal insert/update aja via SQLite Expert Personal.
Thanks buat jawaban nya bos..
belum ktemu permasalahan nya bos.. keterangan nya gini “ExecuteMap: select * from user where username = ? and password = ? No Records Found. kenapa ya kira-kira ?
Itu data user-nya gak ada di databse. Mungkin salah waktu input login.
sama, saya juga kaya mas othong. kasusnya sama persis mas. No Record Found.. ada solusi mas heru?
Password-nya udah diinput langsung ke database-nya? Formatnya md5.
sudah pake md5 tetap aza No Record Found…solusinya mana nih…terima kasih
sama masalah nya nggak ketemu…gimana ya…??/
Perhatikan penulisan password hasil md5-nya. Karena ini sifatnya case sensitive, dan hasil generate (password) md5 via aplikasinya adalah lowercase. Maka… Input password md5-nya (ke database) harus huruf kecil semua, biar kebaca sama sistem.
pake huruf kecil jg masih gagal…”Username dan Password Salah”… “ExecuteMap: select * from user where username = ? and password = ? No Records Found
Coba uninstall dulu APK-nya. Habis itu compile lagi.
sdh dicoba mas Uninstal APK nya,Menggunakan MD5 huruf kecil semua, tetap Gagal… “ExecuteMap: select * from user where username = ? and password = ? No Records Found…apa yg salah ya…???Ada solusi lain mas…??? Terima Kasih…maaf merepotkan
Upload aja source code sama db-nya. Biar saya cek.
ini File yg saya bikin gagal trs…cek ya mas…salah nya dimana…(http://downloads.ziddu.com/download/25192531/New_WinRAR_ZIP_archive.zip.html)…Sebelumnya terima kasih…
Kagak ada file-nya mas, di dalem zip-nya kosong. Btw, upload di goolge drive aja, biar enak download-nya.
Saya udah ikutin langkah2 diatas. Pas Release muncul :
Parsing code. Error
Error parsing program.
Error description: Parameter name cannot hide global variable name.
Kenapa ya Mas?
Makasih
Itu karena di suatu fungsi ada nama variabel/object yang sama dengan nama variabel/object di Sub Process_Globals atau Sub Globals.
Jadi, gak boleh sama mas.
yang di Sub Global nya nggak ada yg dirubah ya ???
Gak perlu. Pokoknya nama variabelnya gak boleh sama.
“Sub CheckLogin (Username As String, Password As String) As Map” masalahnya apa ya mas ?
Error description: Parameter name cannot hide global variable name.
syntak yg muncul ini…menuju sub CheckLogin diatas
Itu di atas sudah saya jelaskan mas 🙂
googling2 lalu buka link ini, lihat kalimat ini, sungguh mencerahkan saya banget mas, matur nuwun
Untuk yang gagal login mungkin juga karena sebelumnya field password di database di set CHAR(20), sedangkan hasil MD5 lebih dari 20 karakter, mungkin bisa coba diganti jadi VARCHAR2(200) misalnya.
Aplikasi di android juga mungkin di uninstall dulu baru coba lagi, karena file database nya kadang tidak terupdate 🙂
Nah ini, kalau cuma 20 karakter memang kurang, dan tentu akan mengakibatkan kesalahan penulisan password-nya, karena ada karakter yang kepotong. Btw, di project ini saya pakai 50 karakter untuk field password.
And… Thanks udah sharing di sini 🙂
Bang saya ko ada error ya? error nya dibagian Sub CheckLogin isi errornya “cannot hide global variable name”. kenapa ya bang?
Coba cek komentar mas Anjaya di atas 🙂
oh iya gan makasih banyak bamg. Terus boleh saya nanya tentang menu slide ga bang? Soalnya saya belum ngerti soal bikin menu slide dari samping gitu bang
Mas masih bingung masaah yg kaya gini “ExecuteMap: select * from user where username = ? and password = ? No Records Found
kenapa ya kira2? padahal database sudah di isi. Trims
Coba cek komentar teman2 di atas. Masalahnya sama, kali bisa jadi solusi.
mas kalo buat form login di client server/ database myql ada tutorialnya…. atau yang perlu dirubah bagian mana ?
Coba ke sini: http://www.alwaysdelheru.com/cara-menghubungkan-aplikasi-android-ke-database-mysql/#comment-122
kenapa keluar kenyataan password or username salah,padahal diikut sama dengan password dalam database
Bisa dicek kembali komentar kawan-kawan di atas. Karena juga ada yang mengalami masalah yang sama, dan insya Allah solved.
boosss kalau tidak menggunakan md5 bole tak..susah la kalau menggunakan md5 ni…ad solution lain x….
Boleh. Skip aja proses enkripsi password-nya.
boss saya sda bole untuk login tetapi untuk stu user aja…user yang lain tidak bole…knapa ya boss..padahal suda ada di database
[…] Membuat Form Login Aplikasi di Basic4Android (2) […]
kaka master.. mau tanya. ane udah copas codingan anda, nah pas ane run bisa. tapi pas ngeklik button login keluar error dbutils_executemap (java line: 374) bla bla….. apa harus pake sqlite? soalnya saya pake nya wamp. maklum newbie
Kalau yang ini harus pakai sqlite. Tapi biar jelas sebab erornya apa, coba tunjukkan ke saya log error lengkapnya.
Assalamualaikum mas, saya baru belajar B4A. Saya menemukan error berikut saat debug di smartphone
oid.database.sqlite.SQLiteException: no such column: username (code 1): , while compiling: select * from user where username = ? and password = ?
bagaimana mengatasinya? terima kasih 🙂
Wa’alaikumussalam…
Erornya karena di table user tidak ada field username. Sudah dibuatkan field username dan password belum di table user-nya?
Assalamualaikum bg
gmn cara nya agar mengambil suatu data dari activiy pertama ke activity kedua
misalnya, saya bkin “sayur” di edittext1.text activity 1, kemudian saya ingin menampilkanya di label1.text di activity kedua
tlong bantu bang trimakasih
Wa’alaikumussalam… Kan udah di-reply di sini: http://www.alwaysdelheru.com/membuat-multi-activity-di-basic4android/#comment-935
yang masih error no record found coba konversi ke hasil generate MD5 ke lowercase
Mungkin mylogin.db belum di sync.
Caranya klik menu Windows – File Manager – Sync
Centang mylogin.db
maaf ni, sy baru…ko username & password salah terus ya, mksh gan
mas sudah saya coba running pake debug usb cuma pas udh terinstall di Hp malah kya gini tulisan errornya
An error has occurred in sub:
java.io.FileNotFoundException:troll.db
continue?
mohon pencerahannya mas salahnya dimana thx
mas punya saya ketika di jalankan di hp, malah “Unfortunately Example has stopped” itu kenpa ya mas ?
klo mau buat multi login gimana caranya min?
Cara buat multi login gimana min..
1 form login buat 2 menu
Misal login penjual & pembeli yang beda tabel database dan beda menunya
Mas Ini coding DBUltisnya apa khusu buat sqlite doang apa emang bisa buat msql juga
Saya pakai b4a versi 8.30 bajakan. Saya pakai semua source code dan sesuai tutorial tidak jalan di hp. Kalo boleh tahu tutorial itu pake b4a versi berapa? Apa beda versi beda coding?
Maaf, saya justru mengalami masalah yang aneh. Setelah saya ikuti semua tutorial malah muncul error di java languange nya(input output mylogin.db error). Aplikasi gak bisa jalan. Bahkan saya sudah coba dengan source code yang anda upload. Library 100% sudah sesuai di tutorial. Pertanyaan saya, apakah musti pake software original atau kah beda versi beda fitur? Saya pake b4a versi bajakan 8.30
kalo error kayak gini
java.io.FileNotFoundException: /storage/emulated/0/Android/data/b4a.example/files/mylogin.db (No such file or directory)
mohon solusi mas
Передаем Вам сведения об одобрении выдать Вам некую сумму. Обезопасьте себя! без промедления разбираться с подробностями зайдя на основную страницу нашего сервиса в момент до 2 дней.Не пропустите момент! . В случае просрочки Ваш доступ в систему будет заблокирован!Переход на страницу: https://tinyurl.com/dawcoect NMVValwaysdelheru.comRKKF
Bang kok saat di RUN hasilnya tidak muncul ya? padahal saya telah mengikuti langkah-langkah yang ada diatas