Your condition retrieves 1 record only. If you have more than one record where Emirate = 'Qatar', only the first one is retrieved, because the = condition is satisfied. You need to use the LIKE operator instead of =, to get them all. Replace your query with: String query= "SELECT...
Why this method is not available? Because it is marked with an @hide annotation. Any classes and methods that you see in the Android source code marked with @hide are not part of the Android SDK. They will not appear in the JavaDocs and they are not part of...
Put your select in Brackets: INSERT INTO Players VALUES('Name', 10.0, (SELECT COUNT(*) AS Amount FROM Stack7 WHERE Name LIKE '%Name%'), 1.0); In this way the compiler knows where the one value defined by your select statement starts and where it ends. And you are able to use a comma (,)...
java,android,mysql,database,sqlite
I am trying this if(curs!=null) { List<Cursor> listCursor = new ArrayList<Cursor>(); curs.moveToFirst(); if(curs.getCount()>=1) { do { String strID = curs.getString(curs.getColumnIndex(KEY_NAME)); String [] sqlSelect = {"0 _id", "TB", "Version", "Book", "Chapter", "NKJ"}; String sqlTables = "hindibible"; SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(sqlTables); StringBuilder strQuery = new StringBuilder(); strQuery.append("ID = "+strID); Cursor...
You could set-up a backend using some database (eg. MySQL) and some programming language (eg. PHP) as well as some kind of web-server (eg. Apache). You would store the products,user data in tables of the database. Pictures would be stored on some directory on your server and you could store...
I think you meant to use LIMIT clause like SELECT * FROM table WHERE Service = 'SecondClassStandard' AND Max_Weight >= 0.075 LIMIT 1; ...
mysql,sqlite,left-join,union-all,right-join
The purchase_list_items table already contains the user_id. A query to look up the corresponding name would look like this: SELECT first_name FROM users WHERE user_id = ? This can be directly integrated into the larger query as a correlated subquery: SELECT ..., (price * quantity) as Cumulative_Price, (SELECT first_name FROM...
It is very simple just place the Sqlite Database file inside your project folder and then in your program in order to connect to the database file create the connection like connection = DriverManager.getConnection("Jdbc:sqlite:name of your sqlite database file"); Now in order to connect to the database file after creating...
c#,.net,sqlite,join,windows-phone-8
Create a class which has properties from both the class and use that classes. In your case it will have ITMID_PK,ITMNAME, description ,iCON and PRICE. Just keep the properties name same as column name. That class can be a separate class or Base class for these two classes. Edit: You...
android,performance,sqlite,compare
In your case needs value the situation!! When I have this problems the first questions are... The tables that I want to do 'drop table' have few data? If it's yes the best way is the 'drop table' command. If it's no then you need to use the 'insert' and...
It looks you most likely have changed the schema structure, and (most likely) bumped version number of your database. This, in conjunction with broken onUpgrade() implementation caused your problems. As a quick solution: uninstall the app and install again - this will completely wipe the database and make your app...
Have you ever run the program with the database creation before? If you have, you will need to increment your database version number. This has to be done when you make additions. You can also try uninstalling the app in the emulator and re-running a fresh install....
android,sqlite,android-intent,homescreen
Hey guyz i have solved my problem of fetching data from tables based on column values and know i want to share the sloppy mistakes. TextView lblEmail = (TextView) findViewById(R.id.textView1); TextView lblReg = (TextView) findViewById(R.id.textView1); TextView lblName = (TextView) findViewById(R.id.textView1); This code has to be written like as stated below...
You could just use a LIKE clause for this. Also your between won't work for edge cases if you have milliseconds after :59. WHERE t LIKE '2015-08-01 %' and: WHERE t LIKE '2015-%-12 %' Also, regarding optimization, timestamp or similar has text affinity (even though the docs seem to allude...
I believe the BEGIN queries are a work around in the sqlite backend to deal with quirks of sqlite. I think you'll will see one BEGIN for every write that you do outside of a transaction. If you want to dig into the code further, start here. So there isn't...
Assuming I understand your question, it seems simple enough. To get a subset just use a between...and operator on the sequence column: SELECT stop_from, stop_to FROM routes WHERE sequence BETWEEN 2 AND 11 ORDER BY sequence To get the subset in the opposite direction, just order by desc, and select...
Can you try to re-shuffle the SQL autoincrement location? db.execSQL("CREATE TABLE " + TABLE_NAME + "(" +COL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT,"+COL_2 + " TEXT,"+COL_3 + " TEXT,"+COL_4 + " TEXT,"+COL_5 + " TEXT)"); Edit: Actually, I may have been over complicating. It appears (according to the SQL Lite...
You should use some kind of database.I recommend an sql db with an orm - it lets you create a database based on classes and eliminates the need in ton of sql. I like active android, but also take a look at sugar orm. You should have a messages table,...
You need to make an if statement for each number if(oldVersion < 5) ... sql alter statement for the first new column ... if(oldVersion < 6) ... next sql alter statement ...
For the sqlite issue, you need to have whitespace between column names and types. For example, change TaskEntry.COLUMN_TASK_DUE + "DATETIME, " + to TaskEntry.COLUMN_TASK_DUE + " DATETIME, " + There's a similar problem with almost all of your columns. After fixing the CREATE TABLE SQL, uninstall and reinstall your app...
Do you include the cordovasql script? <script src="lib/persistencejs/persistence.store.cordovasql.js"></script> PS. For some reason installing persistencejs with bower didnt work for me. I manually downloaded the github repo from https://github.com/coresmart/persistencejs...
As shown in the documentation, you can simply insert the desired values in the PK column: INSERT INTO Type(id, typename) VALUES(2, 'novel') And if you never need autoincrement values, you should not use an autoincrementing column in the first place....
str.__mod__() is a method on str: db = sqlite3.connect("%s" % fullpath) Or because fullpath is already a string: db = sqlite3.connect(fullpath) ...
You have to join both tables, group by book and apply a group_concat on the author namecolumn. The official documentation of the function is here And here´s another example I´ve found in stackoverflow...
You can import the mysqldump directly from SQLLite on Android if you're exporting it in the .sql format and adding options for recreating tables etc. No need to worry about the non-SQL syntax in the file, as it should be commented out....
Your b is null. You didn't put anything in intent and you are fetching from intent. Put "score" in intent in SaveDataActivity then fetch from intent in ResultActivity. How to use putExtra() and getExtra() for string data...
ruby-on-rails,sqlite,model-view-controller
you don't need the = here: <%[email protected] do |t|%>, the equals sign is telling erb to show every message on the view. <% %> Will execute Ruby code with no effect on the html page being rendered. The output will be thrown away. <%= %> Will execute Ruby code and...
getContentResolver().update(FTagsContentProvider.CONTENT_URI, values, FTagsContentProvider.COL_TEXT + "=?", new String[]{mFtag}); is the correct usage. public static final String COL_TEXT = "text"; text is a reserved keyword. You can't have a column named text. Change the name of the column and you'll be fine....
What do you expect? You only select the first row of the table. And this is always the same row. The "PRAGMA"-statements have no visible effects here.
python,xml,sqlite,parsing,xmltodict
The ? can only be used for values, not for column names. This INSERT INTO stocks ? VALUES '?' is not valid. You must use INSERT INTO stocks (columnname) VALUES (?) Note the missing quotes around the ?. In code: c.execute("INSERT INTO stocks ({}) VALUES (?)".format(column["@name"]), column["#text"]) ...
In an object oriented language, would you make a class for every user? Or would you have an instance of a class for each user? Having one table per user is a really bad design. You can't search messages based on any field that isn't the username. With your current...
remove this line in your sqllite constructor: SQLiteDatabase db=this.getWritableDatabase(); you try to get the db, which is currently initializing....
Specified 'sqlite3' for database adapter, but the gem is not loaded. Add gem 'sqlite3' to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). Add gem 'sqlite3', group: :development to your Gemfile and do bundle install. And also you should be putting pg gem in...
c#,sql-server,sqlite,if-statement,sqlite3
You can do in one go. Above 2 statements are equivalent to this: SELECT DISTINCT x, y FROM t1 LEFT OUTER JOIN t2 ON t1.id = t2.id AND t2.id = @secondId AND (t1.id = @firstId OR @firstId = '') ORDER BY t1.somecolumn ...
What would be a correct way for overwriting existing row? Specify a conflict resolution strategy, such as INSERT OR REPLACE INTO foo ... If the insert would result in a conflict, the conflicting row(s) are first deleted and then the new row is inserted....
SOLVED: In a Maven Project, all the resources are copied into another directory after the "build" command. I was reading the wrong db.
I think you want a correlated subquery: select t1.* from Table1 t1 where exists (select 1 from Table2 t2 where t2.code = t1.code and t2.codeTable1 is not null ); This seems like a pretty direct translation of your requirements....
Apparently the correct syntax is let querySQL = "SELECT name, picture_name from member_data where picture_name is not ? and name not in (?, ?) ORDER BY RANDOM() LIMIT 1"; rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: ["None", "Bob", "Susan"]) ...
This is your query, which I understand until the end of the on clause: Select EMPLOYEE.* from EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.empID = DEPARTMENT.empID =%@",_txtfind.text]; Perhaps you want where clause of some sort? Select e.*, d.col1, d.col2, . . . from EMPLOYEE e INNER JOIN DEPARTMENT d ON e.empID...
Records in a relational database tables are unordered by nature. therefor, you can simply create a table that has all the values between @First and @Last (0 and 9999 in your case), and then use a random order by when selecting from that table. you can also use a simple...
The method you're looking for is QSqlQuery::lastInsertId(). To quote the documentation: Returns the object ID of the most recent inserted row if the database supports it. An invalid QVariant will be returned if the query did not insert any value or if the database does not report the id back....
In your query - SELECT DISTINCT _id, task, date, grup FROM mainToDo WHERE grup=top - you are not using quotes when refering to the text value (top). It should be between quotes otherwise SQL will not recognize it as a string value. Correct query: SELECT DISTINCT _id, task, date, grup...
sql,ruby-on-rails,sqlite,sqlite3
See this post: How to SQL compare columns when one has accented chars? Another idea: There is an easy solution, but not very elegant. Use the REPLACE function, to remove your accents. Exemple: SELECT YOUR_COLUMN FROM YOUR_TABLE WHERE replace(replace(replace(replace(replace(replace(replace(replace( replace(replace(replace( lower(YOUR_COLUMN), 'á','a'), 'ã','a'), 'â','a'), 'é','e'), 'ê','e'), 'í','i'), 'ó','o') ,'õ','o') ,'ô','o'),'ú','u'),...
The problem seems about write permission on the database. Android give you this 2 method to manage the creation and upgrade of a new database public class MyDBHandler extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase arg0) { //add here the sql code to create the database } @Override public void...
You need left join to keep all the records in the first table. Then you need it twice to get the English records for the default: SELECT td.day, coalesce(tdeu.text, teng.text) as text FROM todos td left join translations tdeu ON td.text_id = tdeu.text_id and tdeu.locale = 'deu' left join translations...
ExecuteScalar will return only a single value, the first row/first column of the result set. It is typically used to retrieve a single value (for example, an aggregate value) from a database, like COUNT etc. You need a collection of records back. Use: SQLiteDataReader SQLiteDataAdapter to fill a DataTable or...
your slots definitely not null because of this : String slots = new String(); it should be String slots = null; Cursor cursor = database.query(ChosenSlotDatabaseHandler.TABLE_CHOSEN_PARKING_SLOT, chosenSlotColumn, null, null, null, null, null); if( cursor.moveToFirst() ) { slots = cursor.getString(0); } // make sure to close the cursor cursor.close(); return slots; EDIT...
Use a join instead: SELECT a, b FROM t JOIN (SELECT DISTINCT date FROM t ORDER BY date DESC LIMIT 2) tt on t.date = tt.date; ...
try this: func getTableRows() { sharedInstance.database!.open() let sqlStatement = "SELECT COUNT(field) FROM table_name" var resultSet: FMResultSet! = sharedInstance.database!.executeQuery(sqlStatement, withArgumentsInArray: nil) if (resultSet != nil) { let rowCount = XXXX NSLog("Table Rows = %i",rowCount) } sharedInstance.database!.close() } ...
sqlite,foreign-key-relationship,database-migration,alembic
After some research I found that the problem here is the way Alembic does the batch migration. In short, at the current version (0.7.6) of Alembic it's not possible to create relation with self by migration. As described in the Alembic documentation, to do the migration, new table is created...
android,database,sqlite,android-sqlite
Just return the column you want: ArrayList<String> getAllNotes() { Cursor cursor; mDbHelper = mSqliteHelper.getWritableDatabase(); String query = "SELECT Distinct NOTES_COLUMN FROM " + SqliteHelpers.TABLE_NAME; cursor = mDbHelper.rawQuery(query, null); ArrayList<String> arrayList = new ArrayList<>(); while (cursor.moveToNext()) { String itemname = cursor.getString(cursor.getColumnIndex(SqliteHelpers.NOTES_COLUMN)); if (itemname != null) { arrayList.add(itemname); } } return arrayList;...
.net,sqlite,system.data.sqlite
I suggest you start with the driver-agnostic SQLite documentation on the subject. It explains the way booleans should be stored, and the different datetime serialization schemes, for example. For more details, System.Data.SQLite is open source, and while a bit crufty around certain edges, is generally quite easy to read. For...
Try to use SQLiteAssetHelper, which has all the code that you need to install a pre-packaged database when your app is first run. Ref : Reading sqlite file from asset folder...
As you noticed, the database name is cookies.sqlite not cookie.sqlite. Why didn't I get an error? I though python would error out on. con = lite.connect('cookie.sqlite') Connecting to a sqlite database either opens an existing database file, or creates a new one if the database didn't exist....
You go wrong here + KEY_SUM + " TEXT," // remove ,(comma) from last correct: String DATABASE_CREATE_SQL = "CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TRANSACTION + " TEXT NOT NULL, " + KEY_ITEM + " TEXT NOT NULL,...
android,sql,sqlite,select,android-sqlite
String literals in SQL are denoted by single quotes ('). Without them, and string would be treated as an object name. Here, you generate a where clause title = Test. Both are interpreted as columns names, and the query fails since there's no column Test. To solve this, you could...
Why not just put them into a dict, that way you'll only get one entry per every minute: times = [ '2015-06-18 11:36:57.830000', '2015-06-18 11:36:57.830000', '2015-06-18 11:36:59.340000', '2015-06-18 11:36:59.340000', ] time_dict = {} for time in times: time_dict[(time.split('.'))[0][:-3]] = 1 print(time_dict.keys()) Even better, you could create the dict before you...
java,android,arrays,performance,sqlite
The way you're doing this is pretty efficient in slowing everything down (and your helper helps you with it a lot): String no= myDbHelper.getSome(ques,0, getCourseTag()); In each such line you execute a query, create a 2D array holding the whole table and throw nearly everything away. And you fail to...
android,sqlite,android-studio,android-sqlite
First of all, you have to put whitespaces between each column names and their type : db.execSQL("CREATE TABLE " + TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME + " TEXT," + PHONE + " TEXT," + EMAIL + " TEXT," + ADDRESS + "...
I don't think you can use the IN syntax with multiple columns Delete from TABLENAME where (FOO = <foo_value1> AND BAR = <bar_value1>) or (FOO = <foo_value2> AND BAR = <bar_value2>); ...
I had a similar issue the other day. The issue that I was using keywords as objects. To avoid syntax errors you might want to escape your objects, like: SELECT [Email] FROM [Client] WHERE [Email] = @ID; ...
This behaviour comes neither from SQLite (commands like CREATE TABLE work perfectly well inside transactions) nor from Python; it's the Python sqlite3 module that tries to be clever and inserts automatic transactions at some places. This is documented, but the reasons given are rather flimsy: There are two reasons for...
To get value or multiple values you need a cursor, see the following function (that return the first value it's perfect to get id's, for example): public String getSingular_Value_InTransaction(String query){ //Declaration of variables Cursor a1 = null; try{ a1 = database.rawQuery(query,null); a1.moveToFirst(); if(a1.getString(0) != null){ String result = a1.getString(0); a1.close();...
You should first initialize your database object, before you could insert or do what you want with it. I think that now you just have only the declaration of it ( SQLiteDatabase database; ), not the whole initialization like SQLiteDatabase database = mDbHelper.getWritableDatabase(); for example. More info -> http://developer.android.com/training/basics/data-storage/databases.html
There is no need to worry about the format of the date when storing it. The database will simply store the date instance and you can use one of its functions to format it on retrieval. You could also use Java to format the date on retrieval using SimpleDateFormat...
You are trying to give name group to one of your columns. group itself is a keyword in SQLite so you can't use it. Just change the name of column from group to something else. Check this...
java,android,json,sqlite,nullpointerexception
as it seems your "databaseadapter" object is reference to null..hence it throws nullpointerexception .... do one thing and check it crashes or not... add both line databaseadapter=new DbAdapter (this); databaseadapter=databaseadapter.open(); in onActivityResult() ... ...
as far as i know, one solution would be to is to create another table of type B_products and use, a value from main product as foreign key, in table 2. So hence you can link both tables, instead of creating a table inside a table. I think this is...
sql,sql-server,sql-server-2008,sqlite
Use sp_MSforeachdb to loop through all your databases. sp_MSforeachdb ' USE [?] ALTER TABLE table_name ADD col1 int, col2 varchar(50), col3 float ' ...
android,sqlite,listview,arraylist,android-arrayadapter
try this : String strQuery="select option from (select option1 as option from table union all select option2 as option from table union all select option3 as option from table union all select option4 as option from table) as result"; Cursor c2 = db.SelectQuery(strQuery); String[] from ={"option"};//you can add as many...
Fixing the NullPointerException: First, to fix the NullPointerException, initialize Text in onCreate(): @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); Input = (EditText) findViewById(R.id.Input); Text = (TextView) findViewById(R.id.Text); //added dbHandler = new Database(this, null, null, 1); // printDatabase(); } Debugging tips: In order to make sure that insertion into the...
First you need to detect that the database is the old one. One way of doing that is to have a metadata table with name/value text columns (value is a reserved word, so use a different column name) and keep the current schemaVersion in there. If this doesn't exist then...
instead of returning a List or Map, you should better return a own CursorWrapper so you could could look like this: public WorkerCursor getWorkerListBySpec(String spec_name){ String selectQuery = "HUGE QUERY HERE "where specialty.spec_name=?"; Log.e(LOG_TAG, selectQuery); SQLiteDatabase db = this.getReadableDatabase(); Cursor c = db.rawQuery(selectQuery, new String [] {spec_name}); return new WorkerCursor(cursor);...
As far as I am aware, you have nothing to worry about. The quotes simply define the name of the table as a string literal to SQLite. You would only need to worry if the value came back with the double quotes in "widgets" escaped, which you would have seen...
android,database,sqlite,android-sqlite
you can do it just like below code public void rec(int _id){ String query = "SELECT * FROM notesDb WHERE PhoneNumber =" + _id; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()) { do { String temp_address = c.getString(0); String temp_address1 = c.getString(1); System.out.println(temp_address); System.out.println(temp_address1); } while...
database,sqlite,database-design,rdbms
Since database tables do not have any intrinsic order, you must represent the order yourself somehow. Adding a "counter" column to the cross-reference table indeed sounds like the intuitive (and simplest!) way of doing this.
You don't need to worry about the format of the date when storing it. The database will simply store the date instance and you can use one of its functions to format it on retrieval. SQL Lite date functions: https://www.sqlite.org/lang_datefunc.html If you don't want to be tied to the functions...
In protected void onActivityResult(int requestCode, int resultCode, Intent data) { String name = data.getStringExtra("name"); String grup = data.getStringExtra("grup"); today.setToNow(); String timestamp = today.format("%Y-%m-%d %H:%M:%S"); myDb.insertRow(name,timestamp,grup); populateListView(); } You are reading intent data from "name or grup" but in your activity B those string extras never been set correctly....
You haven't assigned any value to btnJoin. This is causing the exception. Edit 1 - How to fix the problem To fix this problem, and also other problems that would happen if you click the button, add the following lines to your onCreate() method after setContentView(R.layout.activity_members_register): txtName = (EditText)findViewById(R.id.register_member_name); txtPassword...
Use DISTINCT for the selection. For more info: http://www.tutorialspoint.com/sqlite/sqlite_distinct_keyword.htm EDIT: Maybe you can select with distinct from the current result. Something like this: SELECT DISTINCT albumTable.album FROM (SELECT albumTable.album, artistTable.artist, songTable.filepath from albumTable inner join artistTable on albumTable.artistID = artistTable.artistID inner join songTable on albumTable.albumID = songTable.albumID ) I don't...
FileOutputStream throws this exception when the file does not exist and cannot be created. I had this probelm before and managed to solve it by first calling openOrCreateDatabase method of the Context object (or SQLiteDatabase class) before OutputStream mOutputStream = new FileOutputStream(f);
c#,linq,entity-framework,sqlite
The biggest optimization would be changing the Contains to a StartsWith. Which would be equivalent to changing from name like '%search%' to name like 'search%'. Otherwise SQLite can't fully use the indexes you placed on the columns and you are basically searching the whole table. // First Name if (!string.IsNullOrEmpty(firstName))...
Would I essentially have to implement in a way where I cross-referenced the item in the packaging table so that there would be a column stating how much of each item fits in each package? Yes, but instead of putting the cross-reference in the packaging table, use a junction...
java,android,multithreading,sqlite,android-asynctask
When you have to do tasks based on time in Android you should use a Handler. In your case use Handler.postDelayed(Runnable, long). Create and execute the handler in your onPostExecute. The problem with your approach By using Thread.sleep you stopped the execution of the current thread, which in onPostExecute is...
Basically, you can not. But you can use a SQLite cordova plugin if you are developing a hybrid mobile application. http://ngcordova.com/docs/plugins/sqlite/ is one of the best SQLite plugins for cordovajs....
java,android,sqlite,android-sqlite,sqliteopenhelper
you should copy the .db file from your assets folder to an internal/external storage. You can use following codes, private static String DB_PATH = "/data/data/your package/database/"; private static String DB_NAME ="final.db";// Database name To create a database, public void createDataBase() throws IOException { //If database not exists copy it from...
python,sqlite,python-2.7,sqlite3,boolean
You can use 'in' if condition else 'out': print row [1] + " has been checked " + ('in' if row[3] else 'out') ...
javascript,html,sqlite,cordova
You made a mistake: you used result instead of res: tx.executeSql("SELECT (date) FROM time", [], function (tx, res) { var len = result.rows.length; // <- should be res if (len > 0) { for (var i = 0; i < len; i++) { var a = results.rows.item(i)['date']; // <- should...
I don't think your second insert is colliding with the two values (secID = 1 and 2) already in the table; I think it's colliding with the value you just inserted (secID = 0). You aren't explicitly setting secID anywhere, which means it's 0. So it's inserting 0, over and...
If you need to nest aggregates you must use a Derived Table (or Common Table Expression): select barcount, count(*) as occurrences from ( SELECT bar, COUNT(*) as barcount FROM table GROUP BY bar ) as dt group by barcount ORDER BY barcount ...
I understand that you want to use the same query to get sometimes with a particular problem type like X,Y or Z, and sometimes with any problem type, If that is the case you could use the statement 'like' in your query instead of '=' in the problemtype field Cursor...
Check for NULLs in second table like: SELECT TABLE1.name, TABLE1.surname, TABLE1.id FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.id = TABLE2.id WHERE TABLE2.id IS NULL Alternate solution with NOT EXISTS: SELECT TABLE1.name, TABLE1.surname, TABLE1.id FROM TABLE1 WHERE NOT EXISTS(SELECT * FROM TABLE2 WHERE TABLE1.id = TABLE2.id) One more with NOT IN:...
angularjs,sqlite,cordova,debugging
Have you tried GapDebug? It let's you debug your Cordova/Phonegap app on an Android or iOS device via Chrome Dev Tools or Safari Webkit Inspector and is almost magical. -> https://www.genuitec.com/products/gapdebug/