未添加要插入移动数据库的第一项

Posted

技术标签:

【中文标题】未添加要插入移动数据库的第一项【英文标题】:First item to insert into the mobile database isn't added 【发布时间】:2014-10-13 20:39:49 【问题描述】:

我在 Telerik Platform 移动应用程序中使用 JayData。 JayData 的好人提出了这个我想做的例子:

http://jsfiddle.net/JayData/zLV7L/

 var savefeedIfNotExists = function (feed) 
            //create jQuery promise
            console.log("create deferred for " + feed.FeedID)

            var def = new $.Deferred();

            //async thread 
            pnrDB.PNRFeeds.filter('it.FeedId == ' + feed.FeedID).count(function (count) 

                console.log("Add Feed - " + feed.FeedName);

                if (count == 0) 
                    var f = new PNRFeed(
                        FeedId: feed.FeedID,
                        FeedName: feed.FeedName,
                        ImageName: feed.ImageName,
                        FeedActive: feed.IsActive,
                        OrderNumber: parseInt(feed.OrderNumber) + 1
                    )

                    pnrDB.PNRFeeds.add(f);

                    console.log("Resolve for - " + feed.FeedName);
                    //promise.resolve() indicates that all async operations have finished
                    //we add the ADD/SKIP debug info to the promise
                    def.resolve("ADD");

                    console.log("Resolved - " + feed.FeedName);
                 else 
                    //console.log('feed id not 0 - ' + f.FeedId);
                    def.resolve("SKIP");
                
            );
            //return promise in order to wait for the async result of local database query
            return def.promise();
        ;

但是,我已经添加到此代码中,并且当我还使用 JayData 的 Kendo.js 模块(不同于 kendo 中的 kendo.js)运行它时,当在循环功能。这只会在脚本第一次运行时发生 - 如果您要刷新以重新加载,它会正确运行并插入第一个项目。

在第二次加载时,它似乎工作得很好,没有调用他们的剑道 JayData 模块:

因此,即使它看起来好像要添加第一个项目(ID 19),但该项目永远不会添加到数据库中。但是,当您重新加载完全相同的脚本时,它会再次被标记为 add 并且不会中断,因此它最终会进入数据库。

有人有什么想法或尝试吗?

【问题讨论】:

我会给你一个 +1 只是为了尝试 JayData + Kendo。尽管 JayData 的人坚持认为它有效,但我从来没有成功地制作出有效的 JayData + Kendo DataSource 组合。 到目前为止,我终于能够让一切正常工作。这只是他们在 .apply 中放入的这个小错误,我相信这就是以某种方式切断第一项的原因。如果我不得不放弃 JayData,因为我有一点时间,我不想这样做,对移动数据提供商和那种跨平台功能还有其他想法吗? angularjs promise then not called first time的可能重复 【参考方案1】:

如果您使用的是html5,那么您可以使用webSQL来执行数据操作,它提供了所有的功能,如选择、插入、更新数据 Web SQL 规范定义了一个 API,用于在数据库中存储数据,可以使用 SQL 的变体进行查询。

您可以使用我在英特尔 XDK 移动应用程序中使用过的以下功能

if you are using html5 then you can use webSQL to perform data operations,it provides all functions like select,insert,update on data 

> The Web SQL specification defines an API for storing data in databases
> that can be queried using a variant of SQL. you can use like following
> function

<!-- begin snippet: js hide: false -->
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function insert()
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;
db.transaction(function (tx) 
 var nam = document.getElementById("Tname").value;
 var id = document.getElementById("Tid").value;
 var name2 = "velocity";
  tx.executeSql('CREATE TABLE IF NOT EXISTS APP (id unique, log)');
  tx.executeSql('INSERT INTO APP (id, log) VALUES (?,?)',[id,nam]);
  //tx.executeSql('INSERT INTO LOGS (id, log) VALUES (61,'+name2+')');
  msg = '<p>Log message created and row inserted.</p>';
  document.querySelector('#status').innerHTML =  msg;
);

function readdata()
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var id = document.getElementById("Tid").value;
db.transaction(function (tx) 
  tx.executeSql('SELECT * FROM APP', [], function (tx, results) 
  console.log("All rows:");
   var len = results.rows.length, i;
   msg = "<p>Found rows: " + len + "</p>";
   document.querySelector('#status').innerHTML +=  msg;
   for (i = 0; i < len; i++)
     msg = "<p><b>Name :-" + results.rows.item(i).log +"<br/>Contact :-" +results.rows.item(i).id + "</b></p>";
     msg = "<p><b>Name :-" + results.rows.item(i).log +"<br/>Contact :-" +results.rows.item(i).id + "</b></p>";
	 //var row = result.rows.item(i);
     //msg = console.log("  " + row.contact + " " + row.nam);
	 document.querySelector('#status').innerHTML +=  msg;
   
 , null);
);

function ByContact()
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var con = document.getElementById("Con").value;
db.transaction(function (tx) 
  tx.executeSql('SELECT * FROM APP WHERE (id LIKE ?);',[con], function (tx, results) 
  console.log("All rows:");
   var len = results.rows.length, i;
   msg = "<p>Found rows: " + len + "</p>";
   document.querySelector('#status').innerHTML +=  msg;
   for (i = 0; i < len; i++)
     msg = "<p><b>Name :-" + results.rows.item(i).log +"<br/>Contact :-" +results.rows.item(i).id + "</b></p>";
     msg = "<p><b>Name :-" + results.rows.item(i).log +"<br/>Contact :-" +results.rows.item(i).id + "</b></p>";
	 //var row = result.rows.item(i);
     //msg = console.log("  " + row.contact + " " + row.nam);
	 document.querySelector('#status').innerHTML +=  msg;
   
 , null);
);


</script>
</head>
<body style="background-image:url('f.jpg');background-repeat:no-repeat;">
<h1 align="center"><font color="white">Contact Form</font></h1>
    <div  style="color:white">
<table align="center">
<tr>
<td>contact no</td>
<td><input type="text" id="Tid"/></td>
</tr>
<tr>
<td>Name</td>
<td><input type="text" id="Tname"/></td>
</tr>
<tr>
<td>
<button id="add" onclick="return insert();">Insert</button>
</td>
<td>
<button onclick="return readdata();" id="read">readdata</button>
</td>
<td>
</td>
</tr>
</table>
<table>
<tr>
    <td>
    <button onclick="return ByContact();" id="GetByContact">GetByContact</button>
    </td>
    <td>
    <input type="text" id="Con"/>
    </td>
</tr>

        </table>
        <div id="status" name="status"><font color="white">Your Data Will Show Here</font></div>
</div>       

    </body>
</html>

您可以从以下网站获取更多信息 https://github.com/ccoenraets/backbone-directory/tree/master/localdb http://www.tutorialspoint.com/html5/html5_web_sql.htm

【讨论】:

以上是关于未添加要插入移动数据库的第一项的主要内容,如果未能解决你的问题,请参考以下文章

如果表单未绑定,如何选择 MS Access 组合框中的第一项

拖放 RecyclerView 的第一项会移动几个随机位置

插入排序

折半(二分)插入排序

数据库未从 Activity 恢复

添加项目以成为对象中的第一项